регулярное выражение отрицательный взгляд ^. + (?! \ _ \ d {3} $) не работает - PullRequest
3 голосов
/ 09 июля 2019

Регулярное выражение:

^.+(?!\_\d{3}$)

Должно совпадать: abc_001_952010923

НЕ ДОЛЖЕН совпадать: abc_001_952010923_002

Я бы хотел использовать негативную перспективу, но, похоже, она не работает (похоже, соответствует обоим случаям).

https://regex101.com/r/0jt4ut/1

Буду признателен за вашу любезную помощь.

Ответы [ 3 ]

4 голосов
/ 09 июля 2019

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

^(?!.*_\d{3}$).*$

Это похоже на в вашей обновленной демонстрации .

Проблема с положением негативного взгляда в вашем текущем паттерне заключается в том, что обе входные строки можно сопоставить, сделав .+ достаточно жадным.Утверждая в начале, мы гарантируем, что мы отсеем ненужные входные данные.

Чтобы лучше понять, как abc_001_952010923_002 фактически передает текущее регулярное выражение, рассмотрим следующее:

abc_001_952010923_002 
|   matched by .+  |   (everything matched except last 2)
                   ||  <-- (?!_\d{3}$) lookahead fires here

То есть .+ может потреблять весь шаблон до конечного числа (2), и тогда отрицательный прогноз может быть принят.

0 голосов
/ 09 июля 2019

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

^\D+_\d+_\d+$

Выражение объяснено на верхней правой панели этой демонстрации ,если вы хотите изучить его или изменить его, а в этой ссылке , вы можете посмотреть, как она будет шаг за шагом совпадать с некоторыми примерами входных данных, если хотите.

0 голосов
/ 09 июля 2019

А как насчёт шаблона:

^[a-z]+_\d+_\d+$

Демо

Вы явно сопоставляете каждую группу:

  • ^[a-z]+_ первая группа (буквы) с подчеркиванием
  • \d+_ первая группа цифр с подчеркиванием
  • \d+ вторая группа цифр
  • $ конец строки
...