Попробуйте этот шаблон: ^(?!.*((?(?<=^)|(?<=:))test(?=(:|$))).*(?1)).+$
.
Основная часть - ((?(?<=^)|(?<=:))test(?=(:|$)))
, что соответствует test
, если перед ней стоит двоеточие :
или в начале строки, а затемдвоеточие :
или конец строки.
(?(?<=^)|(?<=:))
это обходной путь к (?<=(:|^))
, но lookbehinds должны иметь фиксированную длину.
Тогда мы имеем обратную ссылку на первую группу захвата (?1)
, чтобы увидеть, есть ли какие-либо другие test
.
Весь этот шаблон помещен в отрицательный прогноз (?!...)
, чтобы соответствовать всему, если он не соответствует шаблону, описанному выше (test
соответствует больше, чемодин раз).
Демо