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

标签 java regex

我有以下 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/

相关文章:

javascript - 我可以使用什么正则表达式来查找简单的正则表达式

r - 如何从 R 列值中删除前几个字符?

java sax 解析器破坏 xml 1.1 的属性

java - Intellij 无法正确识别 Groovy 测试

java - 如何以与 JFrame 相同的方式编写 Android 应用程序

regex - 优化正则表达式解析中文拼音

javascript - 正则表达式匹配不带路径的文件名

java - 使用 SHA1 从多个值计算聚合

java - hibernate 不保存数据

javascript - 在 $.each() 中搜索并替换