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

Regex 正则表达式-什么决定了条件表达式的优先级?,regex,Regex,我想了解正则表达式如何确定特定条件的优先级 取下面的字符串和正则表达式 例1 比赛是在玻璃上进行的 例2 比赛在glasse上进行 例3 将两者结合起来: (\b\w+?)(?=(?:es|s)\b) 比赛是在玻璃上进行的 我想知道,当“es”和“s”都位于字符串的末尾时,为什么“es”优先于“s”。+?是a,这意味着它在继续之前会尝试匹配尽可能少的字符 通常,运算符尝试从左到右尽可能多地匹配,如果表达式的其余部分失败,则返回到较短的匹配。惰性运算符的做法是相反的:尝试匹配尽可能少的字符,如果

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

取下面的字符串和正则表达式

例1 比赛是在玻璃上进行的

例2 比赛在glasse上进行

例3 将两者结合起来:

(\b\w+?)(?=(?:es|s)\b)
比赛是在玻璃上进行的

我想知道,当“es”和“s”都位于字符串的末尾时,为什么“es”优先于“s”。

+?
是a,这意味着它在继续之前会尝试匹配尽可能少的字符

通常,运算符尝试从左到右尽可能多地匹配,如果表达式的其余部分失败,则返回到较短的匹配。惰性运算符的做法是相反的:尝试匹配尽可能少的字符,如果其余表达式不匹配,则展开当前匹配

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


如果将其替换为非惰性,如
(\b\w+)(=(?:es | s)\b)
中所述,它将反过来。首先,它将
glass
分配给第一部分
(\b\w+)
,但无法匹配额外的
e
es
,因此它返回到
glasse
,成功地将剩余的
s
与表达式的第二部分匹配。

这不是优先级问题;正则表达式引擎只需获取它找到的第一个匹配项。您正在使用不情愿的量词,因此在使用第一个字符后,
(\b\w+?)
将手交给
(?=(?:es | s)\b)
,查看它是否匹配。这失败了,所以
(\b\w+?)
使用另一个字符,然后再次放手,依此类推。
(?=(?:es | s)\b)
可以匹配的第一个位置是在
玻璃之后,所以这就是您匹配的位置

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


顺便说一下,您的正则表达式中没有条件。我不确定你到底指的是什么:前瞻--
(?=(?:es | s)\b)
,还是替代--
(?:es | s)
,但条件是。

@FelixKling你是说改变条件的顺序吗?我已经试过了,但没有什么区别。因为
\w+?
。这将查找整个表达式所匹配的最短匹配,它仍然是
glass
。在此位置,
s
(第一个选项)不匹配,但
es
(第二个选项)匹配。如果您想了解正则表达式引擎的详细信息,我建议您阅读。@FelixKling感谢您提供的信息和链接,非常感谢。谢谢您简洁的回答!
(\b\w+?)(?=(?:s)\b)
(\b\w+?)(?=(?:es|s)\b)