2016-01-21 46 views
-1

我試圖替換所有「|」由 「2」 使用下面的代碼:

String myString = "I want to change | with 2"; 
String trimedString = myString.replaceAll("|", "2"); 
System.out.print(trimedString); 

我的預期產量爲:

"I want to change | with 2" 

但實際產量爲:

"2I2 2w2a2n2t2 2t2o2 2c2h2a2n2g2e2 2|2 2w2i2t2h2 222" 

它前後各字符後添加2。這樣做的正確方法是什麼?

+0

管道字符在正則表達式,試圖逃脫「\\ |」代替「|」 。 – Berger

+0

'|'是正則表達式中的特殊字符,所以你需要逃避它:'\ |'(或' 「\\ |」'Java中的字符串)。 – Thomas

+0

順便說一下您的更換和您的預期輸出不匹配。假設您解決您會得到'「我想改變2 2」正則表達式' – Thomas

回答

4

您必須在管道符號前插入兩個反斜槓才能將其轉義。

String myString = "I want to change | with 2"; 
String trimedString = myString.replaceAll("\\|", "2"); 
System.out.print(trimedString); 
2

如果使用replaceAll,則第一個參數將被視爲正則表達式。因此,你需要躲避|,這是一個正則表達式元字符:

String trimedString = myString.replaceAll("\\|", "2") 

或者,你可以使用的replace()方法,而不是replaceAll()之一。它們仍然會替換所有的事件,但不要使用正則表達式匹配。例如:

String trimedString = myString.replace("|", "2"); 

將每個參數視爲文字字符串。或者,由於您正在進行單字符替換,因此您可以使用:

String trimedString = myString.replace('|', '2'); 

這將是迄今爲止效率最高的。

0

你可能是另一個在命名中使用的受害者替換在String類中的方法。

介紹這些方法多數人(根據他們的名字差別),認爲replaceAll(target,replacement)replace(target,replacement)是在一個不同的方式是replace不會取代目標的所有出現(因爲它不具有All後綴)。但事實並非如此,兩種方法都將取代所有目標。

它們之間

真正的區別在於:

  • replaceAll是使用正則表達式(正則表達式)語法,以及一些字符是特殊的有像你|所以你需要逃避它首先"\\|"(也$是特殊在替換部分,所以你需要逃避它)
  • replace使用文字。

所以你的情況,你可以簡單地使用

String trimedString = myString.replace("|", "2"); 

所以

  • 當你看到replaceAll認爲它是replaceRegex
  • 當你看到replaceFirst的事情吧爲replaceRegexOnce
  • 當你看到replace認爲它是replaceAllLiterals