【问题标题】:Is it possible to find exclusive matches (in or group statement) with a backreference?是否可以使用反向引用找到排他匹配项(在或组语句中)?
【发布时间】:2016-02-22 20:26:10
【问题描述】:

我正在阅读反向引用 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 不应该匹配。

我想知道是否只有当testdog 是相互独占时才可以匹配字符串,所以如果首先遇到test,则只有dog 会给出匹配,反之亦然。比如:

(dog|test).*\1   

除了反向引用应该匹配dogtest,具体取决于首先找到的内容。

旁注: 我知道我可以使用(dog.*test|test.*dog) 来做到这一点,但我想知道是否可以使用反向引用(或其他方式)。

【问题讨论】:

  • “这个测试是为了测试狗。”:有效还是无效?换句话说,它应该包含两个单词,还是不应该包含任何单词两次,或者两者都包含?
  • @tobias_k 让我们说不要让它太复杂是有效的,但如果真的可以完全找到它们,那就太好了。
  • @sln 你能举个例子说明我如何使用它来有条件地测试它吗?这是否意味着我可以说if( \1 == dog) then test else dog?类似的东西(但当然翻译成正则表达式)?
  • @sln That works,如果您想将其发布为答案,我想我的问题已经基本解决了。我想知道 tobias 的建议是否可能,真正找到独家匹配

标签: regex backreference


【解决方案1】:

您可以使用条件测试反向引用,否则您只能匹配反向引用。
反向引用对捕获缓冲区是常量,不能更改,只能有条件地测试。

例如(?:(dog)|test).*?(?(1)test|dog)

更新

两次没有捕获到单词

((dog)|test)(?:(?!\1).)*?(?(2)test|dog)

【讨论】:

  • 感谢您的快速回答!去测试他们是否也可以完全排他
  • 也添加了独家正则表达式。请注意,它可以是无限的独家形式。
  • "这是一个测试狗的测试。"确实也有比赛。但这不是我最初的问题,所以谢谢!
  • 不客气。顺便说一句,第二个正则表达式将只匹配突出显示的部分这是对test a dog的测试
【解决方案2】:

当任一术语出现两次时,使用否定前瞻来防止匹配:

^(?!.*?(test|dog).*?\1).*(test|dog).*

匹配“这是测试狗的测试”。 (如预期的那样)。

live demo

【讨论】:

  • 这不起作用。它不匹配 This dog is a test 但它匹配 This test is a test 所以它相反
  • 您的问题不清楚。那么“测试和狗只从彼此身上发现”是什么意思?或者更好:在您问题中的 3 个示例中,哪个应该匹配(以及为什么)?
  • dogtest 只能在字符串中出现一次
  • 负向预测防止不需要的匹配,但您仍然需要匹配 test|dog。前导 .* 是必需的,因为要正确工作,需要锚定负前瞻开始(使用 ^),因此匹配从行首(而不是目标词)开始。我在末尾放了一个.*,所以匹配是包含test|dog 的整行(如果没有它,它将从开头匹配到目标单词,这似乎是错误的)。
  • 是的,test dog 都应该在字符串中恰好出现一次,不能多也不能少。通过这个小编辑它可以工作:^(?!.*?(test|dog).*?\1).*(test.*|dog.*){2} 所以它不再匹配单个 dogtest
猜你喜欢
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多