Java RegEx и переносы строк - ошибка или ожидаемое поведение? - PullRequest
3 голосов
/ 03 апреля 2011

Я пытаюсь интерпретировать многострочную строку с помощью RegEx и просто обнаружил, что сопоставление не будет выполнено, если строка содержит символы новой строки. Я НЕ использую режим MULTILINE, потому что я не использую якоря. Согласно документам API:

В многострочном режиме выражения ^ и $ match сразу после или сразу перед соответственно, терминатор строки или конец последовательности ввода. По умолчанию эти выражения совпадают только на начало и конец всего последовательность ввода.

Короче говоря: он ясно говорит, что этот флаг только меняет работу якорей, и ничего не говорит, например, "когда ваша строка содержит новую строку, вы обязательно должны использовать это" .

public static void main(String[] args) {
    Pattern p = Pattern.compile(".*");

    Matcher m1 = p.matcher("Hello");
    System.out.println("m1: " + m1.matches());    // true

    Matcher m2 = p.matcher("Hello\r\n");
    System.out.println("m2: " + m2.matches());    // false
}

Так это действительно ошибка, или я просто пропустил некоторые документы? Или JAVA использует диалект RegEx, где мой шаблон не работает? Я пользуюсь jdk1.6.0_21.

1 Ответ

3 голосов
/ 03 апреля 2011

Из Шаблон документов :

Регулярное выражение . соответствует любому символ за исключением строки если не указан флаг DOTALL.

Так что вам нужно указать флаг DOTALL, если вы хотите, чтобы m2.matches() было истинным.

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