Java Matcher.find $ соответствует новой строке в однострочном режиме - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь использовать следующий шаблон:

Pattern p = Pattern.compile("^(\\d+)$");

Странно, ИМХО:

p.matcher("123\n").find() == true;
p.matcher("123\n").lookingAt() == true;  // also weird
p.matcher("123\n\n").find() == false;    // ok
p.matcher("123\na").find() == false;     // also ok
p.matcher("123\n").matches() == false;   // ok to me

Цитирование документации для "многострочного флага" из Javadocs:

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

Ну, для меня '\ n' (то есть символ новой строки) не является концом входной последовательностипоэтому «$» должно соответствовать ему только в многострочном режиме.

Я что-то упустил или это ошибка в Java.Кроме того, если вы попробуете тот же шаблон и тестовые строки в Javascript, вы увидите, что Javascript ведет себя правильно:

/^(\d+)$/.test("123\n") == false
/^(\d+)$/.exec("123\n") == null

(кстати, я использую Java 8, на RHEL 7.2)

Спасибо!

1 Ответ

0 голосов
/ 28 января 2019

EOL зависит от операционной системы.

Попробуйте изменить свой тестовый шаблон на «123» + System.lineSeparator ()

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