【问题标题】:Using \b in replaceAll regex在 replaceAll 正则表达式中使用 \b
【发布时间】:2017-02-28 12:14:34
【问题描述】:

我想替换与给定模式匹配的字符串中的文本。我在下面编写了 Java 代码来做到这一点。

public static void main(String[] args) {

         /* Block 1 */
         String s1="123 Test Testing";
         System.out.println(s1.replaceAll("\\bTest\\b", "<Replaced with Test Message>")); // Prints 123 <Replaced with Test Message> Testing


        /* Block 2 */
        String s2="123 Test] Test]ing";
        System.out.println(s2.replaceAll("\\bTest\\]\\b", "<Replaced with Test Message>")); //Prints 123 Test] <Replaced with Test Message>ing

    }

第一个块按预期工作。但是在第二个块中,它不是替换字符串开头的Test],而是替换Test]ing的一部分。

代码或正则表达式有什么问题吗? 如何匹配Test] 而不是Test]Test]ing

【问题讨论】:

  • 所有正确(您的正则表达式完全没有问题,它们按预期工作)。我认为你需要使用"(?&lt;!\\S)Test\\](?!\\S)"
  • @WiktorStribiżew 更新了代码。使用此代码,您的解决方案将失败。
  • “失败”是什么意思?我的建议非常有效 - regex101.com/r/w1wXqd/1
  • 感谢@WiktorStribiżew。但是为什么相同的正则表达式在 javascript 中不起作用?
  • 因为正则表达式与 JavaScript 正则表达式引擎不兼容。您的问题带有 JAVA 标记。

标签: java regex pattern-matching replaceall


【解决方案1】:

正则表达式中的 \b 匹配单词边界,即单词 \w 和非单词 \W 字符之间的位置。由于您的模式中的 ] 是非单词字符,因此单词边界不存在于具有以下空格的第一个位置 (Test] ),而是在 ] 后跟的第二个位置 (Test]ing)单词字符 i。

为了匹配第一个测试],您可以将您的正则表达式更改为

"\\bTest\\]\\B" 

匹配 ] 之后的非单词边界。

【讨论】:

    【解决方案2】:

    您需要从第二个块中删除正则表达式,而不是正常工作。 :)

    System.out.println(s2.replaceAll("Test\\]", "<Replaced with Test Message>")); //Prints Test] <Replaced with Test Message>ing
    

    输出:

       <Replaced with Test Message> <Replaced with Test Message>ing
    

    【讨论】:

    • 请阅读问题。我必须匹配出现在字符串开头的 Test]。不是某个词的一部分。
    【解决方案3】:

    \b 是 Java 正则表达式中的 word boundary。 它适用于仅包含“any lowercase letter, any uppercase letter, the underscore character, or any digit”的单词,即 [a-zA-Z_0-9] 根据 Test] 不是一个词,\b 不能为它工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2017-11-14
      • 1970-01-01
      相关资源
      最近更新 更多