来自regular-expressions.info(强调补充)
让我们再看看内部,以确保你理解 前瞻的含义。让我们应用q(?= u)i来退出。该 先行现在是正面的,后面是另一个令牌。再次,q 匹配q和u匹配你。 同样,前瞻的匹配必须是 丢弃,所以引擎从字符串中的i退回到u。该 前瞻是成功的,所以发动机继续我。但是我不能 匹配你。所以这场比赛尝试失败了。所有剩余的尝试都失败了 好吧,因为字符串中没有更多的q。
这是否必然意味着匹配必须在q
后跟u
未匹配?一旦q
匹配,会发生什么?如果我们想要在q
之后没有u
后执行更多匹配,该怎么办?例如,如果我想继续匹配单词引用中的其余字母? q(?=u)ote
。
答案 0 :(得分:0)
是的,一旦先行断言失败,匹配就会停止。从这个意义上讲,他们与正则表达式的任何其他部分没有什么不同 - 如果他们不匹配"然后整体比赛失败。不同之处在于匹配不会消耗匹配的字符,因此正则表达式的以下部分(如果有的话)仍然需要匹配这些字符。
在这种情况下,u
与前瞻(?=u)
匹配,但匹配消耗u
。因此,在下一步中,u
将针对i
进行测试,并且整体匹配失败。使用q(?=u)
表示q
必须后跟u
。要使用类似的正则表达式匹配quit
,您可以使用q(?=u)uit
。
如果您希望在q
后跟u
之后匹配,那么您可以使用否定前瞻而不是正向前瞻,例如q(?!u)ote
符合qote
,但这些例子都是人为的。 Lookaheads(和Lookbehinds)非常有用,但它们需要一些时间来适应,而绝大多数情况下都不需要它们。