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