Java регулярное выражение заменяет все многострочные - PullRequest
43 голосов
/ 11 ноября 2010

У меня проблема с replaceAll для многострочной строки:

String regex = "\\s*/\\*.*\\*/";
String testWorks = " /** this should be replaced **/ just text";
String testIllegal = " /** this should be replaced \n **/ just text";

testWorks.replaceAll(regex, "x"); 
testIllegal.replaceAll(regex, "x"); 

Вышеприведенное работает для testWorks, но не для testIllegal!Почему это так и как я могу это преодолеть?Мне нужно заменить что-то вроде комментария / * ... * /, который занимает несколько строк.

Ответы [ 3 ]

71 голосов
/ 11 ноября 2010

Вам нужно использовать флаг Pattern.DOTALL, чтобы сказать, что точка должна совпадать с новой строкой. например,

Pattern.compile(regex, Pattern.DOTALL).matcher(testIllegal).replaceAll("x")

или в качестве альтернативы укажите флаг в шаблоне, используя (?s), например.

String regex = "(?s)\\s*/\\*.*\\*/";
11 голосов
/ 11 ноября 2010

Добавьте Pattern.DOTALL к компиляции или (?s) к шаблону.

Это будет работать

String regex = "(?s)\\s*/\\*.*\\*/";

См. Соответствие многострочного текста с использованием регулярного выражения

7 голосов
/ 11 ноября 2010

Метасимвол . соответствует любому символу, кроме новой строки.Вот почему ваше регулярное выражение не работает для многострочного регистра.

Чтобы исправить это, замените . на [\d\D], который соответствует любому символу, включая перевод строки.1010 * Код в действии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...