2017-02-28 53 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" 

匹配]後非單詞邊界。