仅当捕获组遇到一次时才完全匹配

Full match only if the capturing group encountered once

模式:

(test):(thestring) 

只要

之前只有一个test:,我想要的就是全匹配
test:thestring

但在这种情况下不会有完全匹配:

test:test:thestring

我试过限定符,但没用。

需要帮助

试试这个模式:^(?!.*((?(?<=^)|(?<=:))test(?=(:|$))).*(?1)).+$.

主要部分是((?(?<=^)|(?<=:))test(?=(:|$))),如果它前面有冒号:或者在一行的开头后面有冒号:,它匹配test或行尾。

(?(?<=^)|(?<=:)) 这是 (?<=(:|^)) 的解决方法,但回顾必须具有固定长度。

然后我们对第一个捕获组(?1)进行反向引用,看看是否还有其他test.

将整个模式置于负前瞻 (?!...) 中,以匹配与上述模式不匹配的所有内容(test 匹配不止一次)。

Demo

对于这个非常具体的案例:

(?<!.)(test:thestring)

Regex101

它所做的只是搜索字符串 test:thestring 并确保它之前没有字符。 (使用 Michał Turczyn 的正则表达式进行通用搜索!)

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

See in action

如果你想要一个完整的匹配并且应该只有一个时间测试:在 test:string 之前你可以断言字符串的开头 ^,使用否定先行 (?:(?!test:).)如果右侧不是测试,则匹配任何字符:

然后匹配 test:thestring 后跟否定前瞻 (?:(?!test:thestring).)* 如果右侧不是 test:thestring 则匹配任何字符并断言字符串结尾 $

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

Regex demo