2016-01-21 4 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

Btw ваша замена и ваш ожидаемый результат не совпадают. Предполагая, что вы исправляете регулярное выражение, которое вы получите '', я хочу изменить 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 вещь об этом as replaceRegexOnce
  • когда вы видите replace подумайте об этом как replaceAllLiterals.