在replaceAll正则表达式中使用\ b

时间:2017-02-28 12:14:34

标签: java regex pattern-matching replaceall

我想替换匹配给定模式的字符串中的文本。我写了下面的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

3 个答案:

答案 0 :(得分:3)

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

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

"\\bTest\\]\\B" 

匹配]之后的非字边界。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

\b是Java正则表达式中的word boundary。 它适用于仅包含&#34; any lowercase letter, any uppercase letter, the underscore character, or any digit&#34;的单词,即[a-zA-Z_0-9] 根据测试] 不是一个单词,而\b不适用于它。