2017-02-28 57 views
0

我想替换与给定模式匹配的字符串中的文本。我写下面的Java代码来做到这一点。在替换所有正则表达式中使用 b

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

+0

所有正确的(与您的正则表达式没有任何问题,他们按预期工作)。我认为你需要使用'“(?<!\\ S)Test \\](?!\\ S)”'。 –

+0

@WiktorStribiżew更新了代码。使用此代码,您的解决方案失败。 –

+0

“失败”是什么意思?我的建议完美无缺 - https://regex101.com/r/w1wXqd/1 –

回答

1

您需要从第二块比它做工精细除去正则表达式。 :)

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

OUTPUT:

<Replaced with Test Message> <Replaced with Test Message>ing 
+0

请阅读问题。我必须匹配测试],它出现在字符串的开头。不是某个词的部分。 –

3

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

要匹配的第一个测试]你可以将您的正则表达式改变

"\\bTest\\]\\B" 

匹配]后非单词边界。