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

时间:2018-09-13 09:12:23

标签: regex capturing-group regex101

模式:

(test):(thestring) 

只有在test:之前,我想要的是完全匹配的

test:thestring

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

test:test:thestring

我已经尝试过限定词,但是没有用。

需要帮助

3 个答案:

答案 0 :(得分:2)

尝试以下模式:^(?!.*((?(?<=^)|(?<=:))test(?=(:|$))).*(?1)).+$

主要部分是((?(?<=^)|(?<=:))test(?=(:|$))),如果它以冒号test开头或在一行的开头,则与:相匹配,后跟冒号:或结尾

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

然后,我们向后引用第一个捕获组(?1),以查看是否还有其他test

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

Demo

答案 1 :(得分:0)

对于这种非常特殊的情况:

(?<!.)(test:thestring)

Regex101

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

答案 2 :(得分:0)

如果您希望完全匹配,并且应该只进行一次测试:在test:string之前,您可以断言字符串^的开头,请使用否定的前行(?:(?!test:).)来匹配任何字符,如果右侧没有测试:

然后匹配test:thestring,后跟否定查找(?:(?!test:thestring).)*,如果右边没有测试,则匹配任何字符:thestring并断言字符串$的结尾

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

Regex demo