Вместо отрицательного класса символов , вам нужно использовать отрицательный взгляд позади . Тем не менее, поскольку последний шаблон перед lookbehind определен количественно, а длина совпадения шаблона неизвестна, механизм регулярных выражений может backtrack и соответствовать строке, которую вы могли бы потерпеть неудачей. Это означает, что вы не можете просто заменить [^:]
на (?!:)
.
Пример строки, которую не следует сопоставить, может быть ab-3/3/6987
: /\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?!:)/
перехватит 69
с последним \d{1,2}
, а затем (?!:)
опережает, что 8
не :
, и вернет «ОК». Вы получите ab-3/3/69
совпадение.
Вам нужно либо использовать границу слова перед заглядыванием (если следующий символ не может быть буквой, di git или _
), либо вы можете просто добавьте \d
к :
, т.е. используйте (?![:\d])
(тогда вы получите совпадения до буквы или _
).
Итак, используйте либо
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?![:\d])
// ^^^^^^^^^
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}\b(?!:)
// ^^^^^^^
См. regex demo # 1 и regex demo # 2 . Посмотрите, как они ведут себя по-разному с дополнительными входами.