3

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

拿下面的字符串眼镜和下面的正则表达式。

示例 1

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

火柴是在玻璃上做的。

示例 2

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

比赛是在眼镜上进行的。

示例 3

将两者结合起来:

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

火柴是在玻璃上做的。

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

4

2 回答 2

3

+?是一个惰性运算符,这意味着它会在继续之前尝试匹配尽可能少的字符。

通常,运算符会尝试从左到右尽可能多地匹配,如果表达式的其余部分失败,它们会回溯到更短的匹配。惰性运算符则相反:尝试匹配尽可能少的字符,如果剩余的表达式不匹配,则扩展当前匹配。

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

如果你用一个非懒惰的、贪婪的运算符替换它,就像在 中一样(\b\w+)(?=(?:es|s)\b),它会反过来。首先,它分配glasses给第一部分 ,(\b\w+)但未能匹配附加的eor es,因此它回溯到glasse,它成功地将剩余s部分与表达式的第二部分匹配。

于 2012-12-30T19:47:51.267 回答
1

这不是优先级问题。正则表达式引擎仅采用它找到的第一个匹配项。您正在使用不情愿的量词,因此在使用第一个字符后,请先(\b\w+?)查看(?=(?:es|s)\b)它是否可以匹配。那失败了,所以(\b\w+?)消耗了另一个角色并再次放手,依此类推。第一个(?=(?:es|s)\b)可以匹配的地方是 after glass,所以这就是你匹配的。

如果你使用的是正常的、贪婪的量词,情况会有所不同。 (\b\w+)最初会消耗整个字符串,但(?=(?:es|s)\b)会失败。所以它会后退,退还最后一个s. 然后,前瞻将成功匹配s,因此您最终将匹配glasse

顺便说一句,您的正则表达式中没有条件。我不确定您到底指的是什么:前瞻(?=(?:es|s)\b)--或交替(?:es|s)---但条件完全是另一回事

于 2012-12-30T20:06:58.380 回答