Вы можете использовать квантификатор притяжений с отрицательным взглядом
(?<=lookbehind )\d++(?<!456)
^^ ^^^^^^
См. это демо регулярных выражений .
Синоним шаблона с атомарной группой:
(?<=lookbehind )(?>\d+)(?<!456)
информация
(?<=lookbehind )
- положительный взгляд сзади, который соответствует местоположению в строке, которому непосредственно предшествует lookbehind
\d++
- Собственно совпадают 1+ цифр, что не позволяет вернуться к шаблону (двигатель не может повторить сопоставление с любой цифрой, совпадающей с \d++
)
(?<!456)
- проверка с отрицательным взглядом, которая не соответствует совпадению, если последние 3 цифры, совпадающие с \d++
, равны 456
.
Почему смотреть назад и почему не смотреть вперед
Отрицательный взгляд позади (?<!...)
гарантирует, что определенный шаблон не будет совпадать непосредственно слева от текущего местоположения. Отрицательный прогноз (?!...)
проваливает совпадение, если его шаблон совпадает сразу справа от текущего местоположения. «Fail» в данном случае означает, что механизм регулярных выражений отказывается от текущего способа сопоставления строки, и, если перед просмотром сзади / просмотром есть количественные шаблоны, механизм может вернуть обратно в эти шаблоны, чтобы попытаться сопоставить строку по-разному. Обратите внимание, что здесь собственнический квантификатор делает невозможным для движка выполнить проверку просмотра несколько раз 456
, она выполняется только после того, как все цифры будут получены с помощью \d++
.
Вы (?<=lookbehind )([\d])+(?!456)
регулярное выражение соответствует 123456
, потому что \d+
сопоставляет эти цифры жадным образом (все сразу) и (?!456)
проверяет 456
после них, и поскольку там нет 456
, матч возвращается. (?<=lookbehind )([\d])+?(?!456)
соответствует только одной цифре, потому что \d+?
соответствует ленивому способу, 1 цифре соответствует, и затем выполняется проверка loolahead. Поскольку 456
после 1
нет, 1
возвращается.
почему ++
собственнический квантификатор
Он не позволяет обработчику регулярных выражений повторять сопоставление строки по-разному, если ранее были определены количественные шаблоны. Итак, (?<=lookbehind )\d+(?<!456)
соответствует 12345
в 123456
, поскольку 456
до 6
.
нет