Java字符串替换-非捕获组捕获

我有以下 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"));

产生输出:

电话号码:[XXX-XXX-9412]
电话号码:[XXX-XXX]

我的逻辑是找到 3 位数字、破折号、3 位数字(捕获到这一点)、破折号和四位数字(非捕获到这一点)。,以开头的前瞻组?=是非捕获的。根据Pattern Javadoc,以开头的组?:也是非捕获组。我期望两个正则表达式产生相同的输出,Phone number: [XXX-XXX-9412]. 但是,具有非捕获组的正则表达式(?:\\-\\d{4})似乎捕获了整个电话号码并替换它。为什么会这样?


GCT1015
浏览 86回答 1
1回答

呼唤远方

您实际上可以使用捕获组来做您想做的事。在这里它捕获您想要保留的部分并替换整个字符串。这$1是对捕获组的反向引用。 System.out.println(             initial.replaceAll("\\d{3}-\\d{3}(\\-\\d{4})", "XXX-XXX$1"));我假设您意识到如果regex不匹配,则返回原始字符串而不做任何更改。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java