繁体   English   中英

使用Java正则表达式将字符串中的连续字符间隔开

[英]Spacing consecutive characters in string with Java regex

我正在尝试翻译一个字符串并在任何大写字符之前放置一个下划线。 我最接近的是:

out=in.replaceAll("([^_])([A-Z])","$1_$2");

但是使用"ABCDEF"它会返回"A_BC_DE_F" ,我猜是因为在考虑“AB”后,它不会看“BC”,因为“B”已经在上一场比赛中。 当然我可以应用它两次,但有更优雅的解决方案吗?

还有:

out=in.replaceAll("([A-Z])","_$1");

但它增加了一个领先的"_"

Java 1.8,如果重要的话

为什么使用正则表达式?

String underscoreUppercase(String target){
    StringBuilder b=new StringBuilder();
    boolean first=true;
    for(char c:target.toCharArray()){
        if(Character.isUpperCase(c) && !first){//to ommit leading underscore
             b.append('_');
         }
         first=false; 
        b.append(c);
    }

   return b.toString();   
}

对于ABCDE ,它将大喊A_B_C_D_E

您可以将[^_]否定的字符类放入非消费的正面后视图中

s = s.replaceAll("(?<=[^_])[A-Z]","_$0");

请注意,不需要将整个消耗模式与捕获括号括起来, $0反向引用代表整个匹配值。

看到这个Java演示

System.out.println(
      "ABCDEF".replaceAll("(?<=[^_])[A-Z]","_$0")
);  // => A_B_C_D_E_F

你可以在这里使用正向前瞻

正则表达式: ([AZ])(?=([AZ]))其中(?=([AZ]))是一个非消费的正向前瞻

public static void main(String[] args) {
    String in = "ABCDEF";
    String out = in.replaceAll("([A-Z])(?=([A-Z]))", "$1_");
    System.out.println(out);

}

或者,您可以在每个大写字符处拆分字符串并使用下划线连接回来

String in  = "ABCDEF";
String out = String.join("_", in.split("(?=\\p{Upper})"));
System.out.println(out);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM