Каково поведение $ в выражениях регулярных выражений? - PullRequest
0 голосов
/ 29 марта 2019

Каково поведение $ при использовании между или много раз в выражении регулярного выражения?Согласно Regex Wiki"$" должно соответствовать концу строки.Могу ли я использовать $ несколько раз в регулярном выражении для сопоставления последовательных строк?

Рассмотрим следующее регулярное выражение:

^(a$|b)(c)$

Почему приведенное выше регулярное выражение не соответствует строке "a \ nc \ n",Вы можете проверить то же самое в https://regexr.com/4b84o.

Регулярное выражение, кажется, перестает проверять, когда достигается "a \ n", и "c \ n" не проверяется, следовательно, но берется для следующей строки, которая должна быть сопоставлена.Не выражают ли выражения регулярных выражений несколько строк?Обозначает ли $ конец строки (т. Е. \ N символа) или соответствует концу строки, который должен быть сопоставлен?

1 Ответ

2 голосов
/ 29 марта 2019

Во-первых, у вас не включен флаг m, поэтому $ соответствует концу строки.

Даже если у вас включен флаг m, регулярное выражение по-прежнему не будет соответствовать.

Это связано с тем, что $ соответствует только позиции конца строки, т. Е. Это совпадение по длине 0, а не символ новой строки \n.Чтобы сопоставить символ новой строки, вы используете \n.

Так что (a$|b)(c)$ говорит:

Будет a, и это будет конецлинии или b.После этого появляется cc также является концом строки.

Это противоречит самому себе, потому что если a находится в конце строки, будет символ новой строки (или ничеговообще) после него, поэтому не может быть c.Следовательно, ваше регулярное выражение не будет ничего совпадать.

Вместо этого используйте символ \n:

(a\n|b)c\n
...