Java regex replaceAll многострочный
У меня есть проблема с 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!?
Почему это и как я могу это преодолеть? Мне нужно заменить что-то вроде комментария /*... */, который охватывает несколько строк.
Ответы
Ответ 1
Вам нужно использовать флаг Pattern.DOTALL
, чтобы сказать, что точка должна соответствовать символам новой строки. например.
Pattern.compile(regex, Pattern.DOTALL).matcher(testIllegal).replaceAll("x")
или укажите флаг в шаблоне, используя (?s)
, например.
String regex = "(?s)\\s*/\\*.*\\*/";
Ответ 2
Добавьте Pattern.DOTALL
в компиляцию или (?s)
в шаблон.
Ответ 3
Метасимвол .
соответствует любому символу, отличному от новой строки. Вот почему ваше регулярное выражение не работает в случае с несколькими линиями.
Чтобы исправить это, замените .
на [\d\D]
, который соответствует символу любой, включая новую строку.
Код в действии