Регулярное выражение не соответствует новой строке, полученной из объекта 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