为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2023-06-21 14:57:55
我有以下 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不匹配,则返回原始字符串而不做任何更改。


查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信