我想了解正则表达式如何确定特定条件的优先级。
拿下面的字符串眼镜和下面的正则表达式。
示例 1
(\b\w+?)(?=(?:es)\b)
火柴是在玻璃上做的。
示例 2
(\b\w+?)(?=(?:s)\b)
比赛是在眼镜上进行的。
示例 3
将两者结合起来:
(\b\w+?)(?=(?:es|s)\b)
火柴是在玻璃上做的。
我想知道为什么 'es' 优先于 's' 当两者都在字符串的末尾时。
我想了解正则表达式如何确定特定条件的优先级。
拿下面的字符串眼镜和下面的正则表达式。
(\b\w+?)(?=(?:es)\b)
火柴是在玻璃上做的。
(\b\w+?)(?=(?:s)\b)
比赛是在眼镜上进行的。
将两者结合起来:
(\b\w+?)(?=(?:es|s)\b)
火柴是在玻璃上做的。
我想知道为什么 'es' 优先于 's' 当两者都在字符串的末尾时。
+?
是一个惰性运算符,这意味着它会在继续之前尝试匹配尽可能少的字符。
通常,运算符会尝试从左到右尽可能多地匹配,如果表达式的其余部分失败,它们会回溯到更短的匹配。惰性运算符则相反:尝试匹配尽可能少的字符,如果剩余的表达式不匹配,则扩展当前匹配。
因此,第一部分 ,(\b\w+?)
将尝试匹配 1 个字符 ( g
),并查看后面是 anes
还是 ans
以及一个单词边界。由于失败,它会再添加一个字母,依此类推,直到第一部分匹配glass
。在此阶段,第二部分确实与剩余部分匹配es
。
如果你用一个非懒惰的、贪婪的运算符替换它,就像在 中一样(\b\w+)(?=(?:es|s)\b)
,它会反过来。首先,它分配glasses
给第一部分 ,(\b\w+)
但未能匹配附加的e
or es
,因此它回溯到glasse
,它成功地将剩余s
部分与表达式的第二部分匹配。
这不是优先级问题。正则表达式引擎仅采用它找到的第一个匹配项。您正在使用不情愿的量词,因此在使用第一个字符后,请先(\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)
---但条件完全是另一回事。