我正在阅读反馈here,但这完全是为了匹配整个捕获组。假设我有以下字符串:
"This is a test to find the dog."
"This is a dog that I will test."
"This test is made to test."
"This is a test to test a dog."
1和2应该匹配,3和4不应该匹配。
我想知道是否只有在test
和dog
完全相同的情况下才能匹配字符串,因此如果首先遇到test
,则只有dog
将给出一个匹配,反之亦然。类似的东西:
(dog|test).*\1
除了后引用应匹配dog
或test
,具体取决于首先找到的内容。
旁注:
我知道我可以用(dog.*test|test.*dog)
来做,但我想知道是否可以使用反向引用(或其他方式)。
答案 0 :(得分:1)
您可以使用条件测试backref,否则您只能匹配反向引用 反向引用对于捕获缓冲区是不变的,它不能被改变,只能进行有条件的测试。
示例(?:(dog)|test).*?(?(1)test|dog)
更新
未捕获两次单词
((dog)|test)(?:(?!\1).)*?(?(2)test|dog)
答案 1 :(得分:1)
当任一术语出现两次时,请使用否定前瞻以防止匹配:
^(?!.*?(test|dog).*?\1).*(test|dog).*
匹配"这是测试狗的测试。" (如预期的那样)。
请参阅live demo。