#php #regex #regex-lookarounds
#.net #регулярное выражение #отрицательный -предварительный просмотр
Вопрос:
Я создаю регулярное выражение, которое ищет текст, но только если после совпадения нет тире. Я использую предварительный просмотр для этого:
- Регулярное выражение:
Text[s.][0-9]*(?!-)
Expected result Result
--------------- -------
Text 11 Text 11 Text 11
Text 52- <No Match> Text 5
Тестовый пример:https://regex101.com/r/doklxc/1 /
Предварительный просмотр, похоже, совпадает только с предыдущим символом, что оставляет меня с Text 5
, в то время как мне нужно, чтобы он вообще не возвращал совпадение.
Я проверяю https://www.regular-expressions.info / руководства и пробовал использовать группы, но я не могу разобраться с этим.
Как я могу сделать так, чтобы функция lookbehind влияла на все предыдущее совпадение?
Я использую значение по умолчанию.Чистый текст.библиотека регулярных выражений.
Ответ №1:
[0-9]*
Выполняется возврат и позволяет движку регулярных выражений находить совпадение, даже если оно есть -
.
Есть два способа: либо использовать атомарные группы, либо проверить наличие цифры в предварительном просмотре:
Text[s.][0-9]*(?![-d])
Или
Text(?>[s.][0-9]*)(?!-)
Смотрите демонстрацию регулярных выражений # 1 и демонстрацию регулярных выражений # 2.
Подробные сведения
Text[s.][0-9]*(?![-d])
совпаденияText
, затем точка или пробел, затем 0 или более цифр, а затем проверяется, есть ли-
цифра или сразу справа, и если есть, совпадение не выполняется. Даже при попытке отследить и сопоставить меньшее количество цифр, чем было получено ранее,d
в предпросмотре эти попытки завершатся неудачейText(?>[s.][0-9]*)(?!-)
совпаденияText
, затем начинается атомарная группа, в которой обратное отслеживание не будет разрешено после того, как шаблоны группы найдут соответствующий текст.(?!-)
проверяет наличие a только-
после[0-9]*
того, как шаблон попытается захватить какие-либо цифры.
Комментарии:
1. Спасибо! Я думаю, что буду использовать случай атомной группировки, мне кажется, что это немного логичнее.
2. @Damntry Да, это имеет больше смысла. Если бы .NET regex поддерживал притяжательные кванторы, это было бы намного чище:
Text[s.][0-9]* (?!-)
.