我有以下 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})似乎捕获了整个电话号码并替换它。为什么会这样?
1 回答
呼唤远方
TA贡献1856条经验 获得超11个赞
您实际上可以使用捕获组来做您想做的事。在这里它捕获您想要保留的部分并替换整个字符串。这$1
是对捕获组的反向引用。
System.out.println( initial.replaceAll("\\d{3}-\\d{3}(\\-\\d{4})", "XXX-XXX$1"));
我假设您意识到如果regex
不匹配,则返回原始字符串而不做任何更改。
添加回答
举报
0/150
提交
取消