Java 正则表达式替换所有边界不起作用


    System.out.println("R.A.F. stands for R.A.F. blablabla".replaceAll(
            "\bR\.A\.F\.\b", "royal airforce army"));

我想用"皇家空军"替换字符串中的第二个 R.A.F,为什么它不起作用?

单词边界匹配以下任何点:

  • 前一个字符是单词字符,下一个字符不是(或字符串的末尾)
  • 下一个字符是单词字符,而前一个字符不是(或字符串的开头)。

由于.不是单词字符,因此模式.b 将只匹配后跟单词字符的.,即它将匹配R.A.F.foo,但不匹配R.A.F. foo

如果要确保它与紧跟单词字符R.A.F.不匹配,请改用以下内容:

"\bR\.A\.F\.(?!\w)"

但这将替换示例输入中的两个实例,因为第一个R.A.F前面是字符串的开头。如果你只是想替换第二个,我建议使用这样的东西:

"(?<=\W)R\.A\.F\.(?!\w)"

我会尝试:

System.out.println("R.A.F. stands for R.A.F. blablabla".replaceAll(
                   "\sR\.A\.F\.", " royal airforce army"));

输出:

R.A.F. stands for royal airforce army blablabla

附注:注意我在"皇家空军"之前添加了一个空格。

最新更新