一个积极的前瞻会结束正则表达式继续匹配的能力吗?

时间:2014-08-30 19:53:48

标签: regex

来自regular-expressions.info(强调补充)

  

让我们再看看内部,以确保你理解   前瞻的含义。让我们应用q(?= u)i来退出。该   先行现在是正面的,后面是另一个令牌。再次,q   匹配q和u匹配你。 同样,前瞻的匹配必须是   丢弃,所以引擎从字符串中的i退回到u。该   前瞻是成功的,所以发动机继续我。但是我不能   匹配你。所以这场比赛尝试失败了。所有剩余的尝试都失败了   好吧,因为字符串中没有更多的q。

这是否必然意味着匹配必须在q后跟u未匹配?一旦q匹配,会发生什么?如果我们想要在q之后没有u后执行更多匹配,该怎么办?例如,如果我想继续匹配单词引用中的其余字母? q(?=u)ote

1 个答案:

答案 0 :(得分:0)

是的,一旦先行断言失败,匹配就会停止。从这个意义上讲,他们与正则表达式的任何其他部分没有什么不同 - 如果他们不匹配"然后整体比赛失败。不同之处在于匹配不会消耗匹配的字符,因此正则表达式的以下部分(如果有的话)仍然需要匹配这些字符。

在这种情况下,u与前瞻(?=u)匹配,但匹配消耗u。因此,在下一步中,u将针对i进行测试,并且整体匹配失败。使用q(?=u)表示q必须后跟u。要使用类似的正则表达式匹配quit,您可以使用q(?=u)uit

如果您希望在q后跟u之后匹配,那么您可以使用否定前瞻而不是正向前瞻,例如q(?!u)ote符合qote,但这些例子都是人为的。 Lookaheads(和Lookbehinds)非常有用,但它们需要一些时间来适应,而绝大多数情况下都不需要它们。