2016-05-19 3 views
0

Я попытаюсь объяснить свою проблему небольшим примером. Я реализовал версию 1 и версию 2, но я не получил желаемого результата. Какой параметр замены я должен использовать, чтобы получить желаемый результат с помощью метода replaceAll?String.replaceAll() и n разрывы строк

Версия 1:

String s = "TEST"; 
s = s.replaceAll("TEST", "TEST\nTEST"); 
System.out.println(s); 

Выход:

TEST

TEST



Версия 2:

String s = "TEST"; 
s = s.replaceAll("TEST", "TEST\\nTEST"); 
System.out.println(s); 

Выход:

TESTnTEST



Желаемая Выход:

TEST \ NTES T

ответ

6

От javadoc of String#replaceAll(String, String):

Обратите внимание, что слэш (\) и знаки доллара ($) в строке замены может привести результаты отличаться, чем если бы это были рассматриваться как буквальная строка замены; см. Matcher.replaceAll. Используйте Matcher.quoteReplacement(java.lang.String) для подавления специального значения значений этих символов, если это необходимо.

s = s.replaceAll("TEST", Matcher.quoteReplacement("TEST\\nTEST")); 

Вы все еще нужны 2 обратных косые черты, а \ является metachar для строковых литералов.


Вы также можете использовать 4 обратные слэши без Matcher.quoteReplacement:

  • вы хотите один \ на выходе
  • вам нужно, чтобы избежать его \ как \ является metachar для замены строк: \\
  • вам необходимо избегать обоих с \, так как \ является метахаром для строковых литералов: \\\\
s = s.replaceAll("TEST", "TEST\\\\nTEST"); 
2

Не используйте replaceAll()!

replaceAll() делает регулярок поиска и замены, но ваша задача не требует регулярных выражений - просто использовать текстовую версию replace(), также заменяющего всех вхождений.

Вам нужен дословный обратный слэш, который кодируется как два слеша Java строкового литерала:

String s = "TEST"; 
s = s.replace("TEST", "TEST\\nTEST"); 
System.out.println(s); 

Выход:

TEST\nTEST