正则表达式 - 什么决定了条件的优先级?

时间:2012-12-30 19:32:16

标签: regex

我想了解正则表达式如何确定特定条件的优先级。

使用以下字符串眼镜和下面的正则表达式。

示例1

(\b\w+?)(?=(?:es)\b)

匹配是在玻璃上进行的。

示例2

(\b\w+?)(?=(?:s)\b)

匹配是在 glasse

示例3

结合两者:

(\b\w+?)(?=(?:es|s)\b)

匹配是在玻璃上进行的。

我想知道为什么'es'优先于's',当两者都在字符串的末尾时。

2 个答案:

答案 0 :(得分:3)

+?是一个lazy operator,意味着它会尝试匹配尽可能少的字符,然后再继续。

通常情况下,运算符尝试从左到右尽可能匹配,如果表达式的其余部分失败,则回溯到更短的匹配。懒惰运算符反过来:尝试匹配尽可能少的字符,如果剩余的表达式不匹配,请展开当前匹配。

因此,第一部分(\b\w+?)将尝试匹配1个字符(g),并查看后面的内容是es还是s,以及一个词边界。由于失败,它会再添加一个字母,依此类推,直到第一部分与glass匹配。在此阶段,第二部分与剩余的es匹配。

如果您将其替换为非惰性greedy operator,就像在(\b\w+)(?=(?:es|s)\b)中一样,那么它将会反过来。首先,它会将glasses分配给第一部分(\b\w+),但无法匹配其他ees,因此它会回溯到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