Полное совпадение, только если группа захвата встречалась один раз - PullRequest
0 голосов
/ 13 сентября 2018

Шаблон:

(test):(thestring) 

То, что я хочу, это полное совпадение, только если есть только один test: до

test:thestring

Но в этом случае не было бы полногоmatch:

test:test:thestring

Я пробовал квалификатор, но он не работал.

Нужна помощь

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Если вы хотите полное совпадение и должен быть только один тест времени: перед тестом: строка вы можете указать начало строки ^, используйте отрицательный прогноз (?:(?!test:).), чтобы сопоставить любой символ, если он находится направая сторона не является тестом:

Затем соответствует test:thestring, за которым следует отрицательный символ (?:(?!test:thestring).)*, который соответствует любому символу, если то, что находится справа, не является тестом: thestring и подтверждает конец строки $

^(?:(?!test:).)*test:thestring(?:(?!test:thestring).)*$

Regex demo

0 голосов
/ 13 сентября 2018

для этого очень специфического случая:

(?<!.)(test:thestring)

Regex101

Все, что он делает - это ищет строку test:thestring и следит за тем, чтобы перед ней не было символов. (Используйте регулярное выражение Михаила Турчина для универсального поиска!)

0 голосов
/ 13 сентября 2018
^((?!test:).)*(test:thestring)

См. В действии

0 голосов
/ 13 сентября 2018

Попробуйте этот шаблон: ^(?!.*((?(?<=^)|(?<=:))test(?=(:|$))).*(?1)).+$.

Основная часть - ((?(?<=^)|(?<=:))test(?=(:|$))), что соответствует test, если перед ней стоит двоеточие : или в начале строки, а затемдвоеточие : или конец строки.

(?(?<=^)|(?<=:)) это обходной путь к (?<=(:|^)), но lookbehinds должны иметь фиксированную длину.

Тогда мы имеем обратную ссылку на первую группу захвата (?1), чтобы увидеть, есть ли какие-либо другие test.

Весь этот шаблон помещен в отрицательный прогноз (?!...), чтобы соответствовать всему, если он не соответствует шаблону, описанному выше (test соответствует больше, чемодин раз).

Демо

...