Предварительный просмотр регулярных выражений, удаляющий только последний символ

#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]* (?!-) .