我正在尝试转换字符串,并在任何大写字符之前加下划线。我最接近的是:

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/

10-10 21:50
查看更多