Почему самый правый символ захватывается в обратной ссылке при использовании класса символов с квантификаторами? - PullRequest
1 голос
/ 23 сентября 2011

Если у меня есть шаблон ([a-z]) {2,4} и строка «ab», что бы я ожидал увидеть в обратной ссылке \ 1?

Я получаю "b", но почему "b", а не "a"?

Я уверен, что есть правильное объяснение, но, читая вокруг различных сайтов, объясняющих регулярные выражения, я не нашел ни одного. Кто-нибудь? * * 1005

1 Ответ

0 голосов
/ 14 ноября 2011

Я не уверен, почему никто не поставил это как ответ, но просто для любого, кто нажимает на эту страницу с похожим вопросом, ответ, по сути, заключается в том, что это регулярное выражение:

([a-z]){2-4}

будет соответствовать один символ от a до z не менее 2 и целых 4 раз.Он будет сопоставлять каждый символ отдельно, перезаписывая все ранее сопоставленное и сохраняемое в обратной ссылке (то есть между символами () в выражении).

Аналогичное выражение (предлагается в комментариях к вопросу):

([a-z]{2,4})

перемещает обратную ссылку, чтобы окружить все совпадение (2 - 4 символов a- z) вместо одного символа.

Скобки представляют перехват в обратную ссылку .Когда повторение находится внутри захвата (второй пример), он будет захватывать все символы, которые составляют это повторение.Когда повтор находится за пределами захвата (первый пример), он захватывает одну букву, затем повторяет процесс, записывая следующую букву в ту же обратную ссылку, перезаписывая ее.В этом случае он будет повторять этот процесс еще 2 раза, перезаписывая его каждый раз.

Таким образом, сопоставление с целью abc приведет к \1, равному c.Сопоставление цели с abcd приведет к \1, равному d.С большим количеством букв и в зависимости от функции (и языка), используемой для выполнения регулярного выражения, цель abcde может не соответствовать или может привести к обратной ссылке \1, равной d (поскольку e не является частью совпадения).

Первое примерное выражение может использоваться для получения abc или abcd, если вы используете обратную ссылку whole match (часто $& или * 1044)*, но также \& или \0 и в Tcl, просто символ &) - это возвращает всю строку, совпадающую со всем регулярным выражением.

...