Проблема
Обратите внимание, что (?<=9)
ставится после [a-z]
. Что это означает?
Рассмотрим данные типа "a9c"
.
При запуске regex-engine помещает свой «курсор» в начало строки, которую он повторяет, здесь:
|a9c
^-regex cursor is here
Затем regex-engine пытается сопоставить каждую часть regex-pattern слева направо . Таким образом, в случае [a-z](?<=9)
он сначала попытается найти совпадение для [a-z]
, а после успешного поиска этого совпадения попытается перейти к оценке части (?<=9)
.
Таким образом, совпадение для [a-z]
произойдет здесь:
a9c
*<-- match for `[a-z]`
После этого регулярное выражение совпадения переместит курсор сюда:
a | 9c * ^ --- regex-курсор двигателя ^ ---- соответствует [a-z]
Так что теперь (?<=9)
будет оцениваться (обратите внимание на положение курсора |
). (?<=subregex)
проверяет, существует ли непосредственно перед курсором текст, которому может соответствовать subregex
. Но здесь, поскольку курсор находится непосредственно после того, как a
(?<=9)
«видит» назад, «видит» / включает в себя эти a
как данные, подвыражение которых должно проверяться. Но, поскольку a
не может быть сопоставлено с 9
, оценка не удалась.
Решение (я)
Возможно, вы хотели проверить, стоит ли 9
перед приемлемым письмом. Чтобы достичь этого, вы можете изменить свое регулярное выражение многими способами:
с помощью [a-z](?<=9.)
вы делаете предварительный тест два предыдущие символы
a9c|
^^
9. - `9` matches 9, `.` matches any character (one directly before cursor)
или проще (?<=9)[a-z]
, чтобы сначала искать 9
, а затем искать [a-z]
, что позволит регулярному выражению соответствовать 9c
, если курсор будет на 9|c
.