我想了解正则表达式如何确定特定条件的优先级。
使用以下字符串眼镜和下面的正则表达式。
(\b\w+?)(?=(?:es)\b)
匹配是在玻璃上进行的。
(\b\w+?)(?=(?:s)\b)
匹配是在 glasse 。
结合两者:
(\b\w+?)(?=(?:es|s)\b)
匹配是在玻璃上进行的。
我想知道为什么'es'优先于's',当两者都在字符串的末尾时。
答案 0 :(得分:3)
+?
是一个lazy operator,意味着它会尝试匹配尽可能少的字符,然后再继续。
通常情况下,运算符尝试从左到右尽可能匹配,如果表达式的其余部分失败,则回溯到更短的匹配。懒惰运算符反过来:尝试匹配尽可能少的字符,如果剩余的表达式不匹配,请展开当前匹配。
因此,第一部分(\b\w+?)
将尝试匹配1个字符(g
),并查看后面的内容是es
还是s
,以及一个词边界。由于失败,它会再添加一个字母,依此类推,直到第一部分与glass
匹配。在此阶段,第二部分与剩余的es
匹配。
如果您将其替换为非惰性greedy operator,就像在(\b\w+)(?=(?:es|s)\b)
中一样,那么它将会反过来。首先,它会将glasses
分配给第一部分(\b\w+)
,但无法匹配其他e
或es
,因此它会回溯到glasse
,这会成功将剩余的s
与表达式的第二部分进行匹配。
答案 1 :(得分:1)
这不是优先权问题;正则表达式引擎只需要找到它找到的第一个匹配项。你使用的是一个不情愿的量词,所以在消费了第一个字符后,(\b\w+?)
移交给(?=(?:es|s)\b)
以查看它是否匹配。这失败了,所以(\b\w+?)
会消耗另一个角色并再次放手,依此类推。 (?=(?:es|s)\b)
可以匹配的第一个位置是glass
之后,所以这就是您匹配的内容。
如果你使用了正常的,贪婪的量词,那就不一样了。 (\b\w+)
最初将使用整个字符串,但(?=(?:es|s)\b)
将失败。所以它会退缩,返回最后s
。然后,前瞻将成功匹配s
,因此您最终会匹配glasse
。
顺便说一句,你的正则表达式中没有条件。我不确定你所指的是什么:前瞻 - (?=(?:es|s)\b)
- 或替代 - (?:es|s)
- 但条件是something else entirely。