[英]Match string NOT having two consecutive characters as digits in java regex
[英]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.