2012-03-24 2 views
23

У меня есть строка и хотелось бы просто заменить все строки новой строки в ней строкой " --linebreak-- ".Java Regex - использование метода replaceAll для замены новых строк

было бы достаточно просто написать:

string = string.replaceAll("\n", " --linebreak-- "); 

Я запутался с регулярным выражением его частью. Нужно ли мне две черты для новой строки? Это достаточно хорошо?

+1

Либо работает. См. Ответы на [этот вопрос] (http://stackoverflow.com/questions/9113328/java-regular-expression-need-to-escape-backslash-in-regex) для отличного объяснения. –

ответ

32

Не используйте регулярное выражение!. Для замены "\n" вам потребуется только текстовое совпадение.

replace() Используйте для замены символьной строки с другой:

string = string.replace("\n", " --linebreak-- "); 

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

+2

Так вы говорите, чтобы использовать replace() внутри цикла вместо использования replaceAll() один раз? Я не понимаю, почему это лучшая идея? – Tim

+4

@Tim Вызов 'replace()' * once * заменяет * все * вхождения (не требуется «loop») – Bohemian

+0

О, ничего себе. Спасибо, почему-то я забыл, что при чтении спецификации. – Tim

3

Нет необходимости в 2 backslashes.

String string = "hello \n world" ; 
String str = string.replaceAll("\n", " --linebreak-- "); 
System.out.println(str); 

Выход = hello --linebreak-- world

29

Использование регулярных выражений ниже:

s.replaceAll("\\r?\\n", " --linebreak-- ") 

Там только действительно две новые строки для UNIX и ОС Windows.

1

для новой линии есть свойство

System.getProperty("line.separator") 

Здесь, как и для примера,

string.replaceAll("\n", System.getProperty("line.separator")); 
2

Просто добавить это для полноты картины, так как 2 обратных косых черты, что это реально.

См @dasblinkenlight ответ на следующий вопрос SO (речь о \ т, но это относится и к \ п, а):

java, regular expression, need to escape backslash in regex

«Есть две интерпретации управляющих последовательностей происходит: первый компилятором Java, а затем с помощью механизма regexp.Когда компилятор Java видит две слэши, он заменяет их одной косой чертой. Когда есть t, следуя косой чертой, Java заменяет его на вкладку, slash, Java оставляет его в покое. Однако, поскольку две слэши были заменены одной косой чертой, движок regexp видит \ t и интерпретирует его как вкладку. "

+0

Другое дело, что первый arg to replaceAll может быть плоской строкой или регулярным выражением. В строке «\ n» интерпретируется как литерал, но если вы включаете только другие символы регулярных выражений, например, скобки для наборов символов, то вам нужна дополнительная косая черта для получения правильной строки компилятору регулярных выражений, как вы говорите. ..... например, "[\\ r \\ n] +" – Rondo

10

Так как двигатель Java regex поддерживает \R, который представляет любой разделитель строк (немного больше информации: https://stackoverflow.com/a/31060125/1393766).

Так что если у вас есть доступ к Java 8 вы можете использовать

string = string.replaceAll("\\R", " --linebreak-- "); 
Смежные вопросы