Регулярное выражение не соответствует новой строке, полученной из объекта Formatter
Я не могу сопоставить строку, содержащую символы новой строки, когда новая строка получена с помощью %n
в Formatter
объекте или String.format()
. Пожалуйста, просмотрите следующую программу:
public class RegExTest {
public static void main(String[] args) {
String input1 = String.format("Hallo\nnext line");
String input2 = String.format("Hallo%nnext line");
String pattern = ".*[\n\r].*";
System.out.println(input1+": "+input1.matches(pattern));
System.out.println(input2+": "+input2.matches(pattern));
}
}
и его вывод:
Hallo
next line: true
Hallo
next line: false
Что здесь происходит? Почему вторая строка не соответствует?
Версия Java - 1.6.0_21.
Ответы
Ответ 1
Вы можете установить флаг Pattern.DOTALL
, чтобы сделать .
соответствие новым строкам, по умолчанию это не так. Это делается с помощью обозначения (?s)
. Итак, это регулярное выражение делает то, что вы хотите:
String pattern = "(?s).*[\n\r].*";
Ответ 2
В Windows, на Java, \n
есть LF, \r
- CR, а %n
- CRLF.
Ваш шаблон не соответствует последнему.
Начиная с Java 8, вы можете теперь использовать \r
в регулярных выражениях в соответствии с любой последовательностью конца строки.
Соединитель строк
\r
Любая последовательность строк Unicode, эквивалентна \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
Пример:
String pattern = ".*\\R.*";
String.format("Hallo\nnext line").matches(pattern); // true
String.format("Hallo%nnext line").matches(pattern); // true
String.format("Hallo same line").matches(pattern); // false