我有以下 Java 代码:
String initial = "Phone number: [194-582-9412]";
System.out.println(initial.replaceAll("\\d{3}\\-\\d{3}(?=\\-\\d{4})","XXX-XXX"));
System.out.println(initial.replaceAll("\\d{3}\\-\\d{3}(?:\\-\\d{4})","XXX-XXX"));
产生输出:
Phone number: [XXX-XXX-9412]
Phone number: [XXX-XXX]
我的逻辑是找到 3 个数字、一个破折号、3 个数字(捕获到这一点)、一个破折号和 4 个数字(未捕获到这一点)。根据this tutorial ,以 ?=
开头的先行组是非捕获的。根据the Pattern Javadoc ,以 ?:
开头的组也是非捕获的。我希望两个正则表达式产生相同的输出,电话号码:[XXX-XXX-9412]
。但是,具有非捕获组 (?:\\-\\d{4})
的正则表达式似乎捕获了整个电话号码并将其替换。为什么会发生这种情况?
最佳答案
您实际上可以使用捕获组做您想做的事情。在这里,它捕获您想要保留的部分并替换整个字符串。 $1
是对捕获组的反向引用。
System.out.println(
initial.replaceAll("\\d{3}-\\d{3}(\\-\\d{4})", "XXX-XXX$1"));
我想您已经意识到,如果regex
不匹配,则返回原始字符串而不做任何更改。
关于Java字符串替换-非捕获组捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57664760/