Я бы сформулировал ваше регулярное выражение таким образом, с отрицательным прогнозным утверждением в самом начале шаблона:
^(?!.*_\d{3}$).*$
Это похоже на в вашей обновленной демонстрации .
Проблема с положением негативного взгляда в вашем текущем паттерне заключается в том, что обе входные строки можно сопоставить, сделав .+
достаточно жадным.Утверждая в начале, мы гарантируем, что мы отсеем ненужные входные данные.
Чтобы лучше понять, как abc_001_952010923_002
фактически передает текущее регулярное выражение, рассмотрим следующее:
abc_001_952010923_002
| matched by .+ | (everything matched except last 2)
|| <-- (?!_\d{3}$) lookahead fires here
То есть .+
может потреблять весь шаблон до конечного числа (2
), и тогда отрицательный прогноз может быть принят.