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

问题描述 投票:0回答:4

模式:

(test):(thestring) 

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

test:thestring

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

test:test:thestring

我试过了资格赛,但是没有用。

需要帮忙

regex capturing-group regex101
4个回答
2
投票

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

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

:这是:的解决方法,但是lookbehinds必须有固定的长度。

然后我们有反向首先捕获组(?(?<=^)|(?<=:)),看看是否还有其他(?<=(:|^))

这个整个模式被置于负前瞻(?1),以匹配所有内容,如果它不匹配上面解释的模式(test匹配超过一次)。

(?!...)


0
投票

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

test

Demo

它只是搜索字符串(?<!.)(test:thestring)并确保它之前没有字符。 (使用MichałTurczyn的正则表达式进行全方位搜索!)


0
投票
Regex101

test:thestring


0
投票

如果你想要一个完整的匹配并且应该只有一次测试:在test:string之前你可以断言字符串^((?!test:).)*(test:thestring) 的开头,如果右侧的东西没有测试,使用负向前瞻See in action来匹配任何字符:

然后匹配^,然后是负面的前瞻(?:(?!test:).)匹配任何角色,如果右侧的东西不是测试:thestring并断言字符串的结尾test:thestring

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

$

© www.soinside.com 2019 - 2024. All rights reserved.