正则表达式:比赛之前/之后的环视

Posted

技术标签:

【中文标题】正则表达式:比赛之前/之后的环视【英文标题】:regex: Lookaround Before/After the Match 【发布时间】:2014-07-18 02:42:44 【问题描述】:

考虑一下这段文字:100 dollars

如果我想匹配100(使用前瞻),我写了这个:

\d3(?= dollars)

据我所知,该模式的意思是:仅当(如果)后面跟着" dollars"

时才找到3位数字

但是可以以一种奇怪的方式使用前瞻;再次匹配上述文本中的100

(?=\d3 dollars).3

这怎么可能?我们如何解释前瞻的第二种用法?

【问题讨论】:

【参考方案1】:

请记住,环视是零宽度断言。这意味着它们在匹配时不会消耗字符。它们基本上是对字符串中给定点的检查。在第二个正则表达式中,引擎首先检查字符串中的特定点是否与环顾内的模式匹配,如果匹配,则这次通过消耗字符(.3)从该位置继续匹配。

【讨论】:

也打败我吧。这是要记住的重要事情,不一定是要掌握的最明显的概念。其他常见的零宽度断言是锚点(^$)和字边界(\b)。 @Sam 这是我第一次打败你。在我想回答的大多数正则表达式问题上,你基本上都击败了我 :) 所以在第二种模式中,前瞻实际上意味着“如果”而不是提前? @wiki 在这两种情况下,您都可以将其视为“如果”。在第一种情况下,您首先使用一些字符,并且在匹配它们之后,您还要确保它们后面跟着“美元”。在第二种情况下,您首先确保在字符串中的任何位置后面跟着 3 个数字,然后在确保存在这种模式之后,您从字符串中的该点开始使用 3 个字符(.3) @wiki 正确。例如,ac 匹配 (?=a(v|c))(?=a(c|b)).av 不匹配。

以上是关于正则表达式:比赛之前/之后的环视的主要内容,如果未能解决你的问题,请参考以下文章

如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?

巧解正则表达式环视

巧解正则表达式环视

深入理解正则表达式环视的概念与用法

正则表达式的环视和匹配

正则表达式环视