我正在尝试转换字符串,并在任何大写字符之前加下划线。我最接近的是:
out=in.replaceAll("([^_])([A-Z])","$1_$2");
但是使用
"ABCDEF"
会返回"A_BC_DE_F"
,我想是因为考虑“AB”之后,它不会查看“BC”,因为“B”已经在上一个匹配中了。我当然可以应用两次,但是有没有更优雅的解决方案?还有:
out=in.replaceAll("([A-Z])","_$1");
但会添加一个前置
"_"
。Java 1.8(如果重要)
最佳答案
您可以将[^_]
否定字符类放到非消耗性正向后面
s = s.replaceAll("(?<=[^_])[A-Z]","_$0");
注意,不需要用捕获括号将整个使用模式括起来,
$0
向后引用代表整个匹配值。参见this Java demo:
System.out.println(
"ABCDEF".replaceAll("(?<=[^_])[A-Z]","_$0")
); // => A_B_C_D_E_F
关于java - 使用Java正则表达式在字符串中分隔连续字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55492320/