#regex #nested #eol
#регулярное выражение #вложенный #eol
Вопрос:
Каково поведение $ при использовании между ними или несколько раз в выражении регулярных выражений? Согласно Regex Wiki «$» должно соответствовать концу строки. Могу ли я использовать $ несколько раз в регулярном выражении для сопоставления последующих строк?
Рассмотрим следующее регулярное выражение:
^(a$|b)(c)$
Почему приведенное выше регулярное выражение не соответствует строке «a nc n». Вы можете проверить то же самое на https://regexr.com/4b84o .
Регулярное выражение, похоже, прекращает проверку после достижения «a n», и «c n», следовательно, не проверяется, но принимается для следующей строки, которая должна быть сопоставлена. Выражения регулярных выражений не проверяются для нескольких строк? Обозначает ли $ конец строки (т. Е. символ n) или он соответствует концу строки, которая должна быть сопоставлена?
Комментарии:
1. У вас не включен флаг многострочности, поэтому
$
соответствует только концу строки. Вы также никогда не сопоставляли символ новой строки, который находится междуa
иc
2. Даже при включенном флаге многострочности он не соответствует. Обновлено регулярное выражение по ссылке, чтобы теперь оно соответствовало многострочному.
3. Каким должно быть регулярное выражение, которое соответствует как «a nc n», так и «bc n»? Я новичок в регулярных выражениях и, пожалуйста, аргументирую ваш отрицательный отзыв так, чтобы я удалил вопрос, если посчитал ненужным.
Ответ №1:
Во-первых, у вас не включен m
флаг, поэтому $
соответствует концу строки.
Даже если бы у вас был включен m
флаг, регулярное выражение все равно не соответствовало бы.
Это потому, что $
совпадает только с позицией конца строки, т. е. это совпадение длиной 0, а не символ новой строки n
. Чтобы сопоставить символ новой строки, вы используете n
.
Итак, что (a$|b)(c)$
означает, что:
Там будет
a
и это будет конец строки, илиb
. После этого появляетсяc
. Иc
также является концом строки.
Это противоречит само себе, потому что, если a
находится в конце строки, после него будет символ новой строки (или вообще ничего), поэтому его не может быть c
. Следовательно, ваше регулярное выражение ничему не будет соответствовать.
Вместо этого используйте n
символ:
(an|b)cn