正则表达式:优先级匹配



假设我有以下字符串:"a / b + c - e = d" .

我想匹配以下任何一项:+/-。但是我希望+优先于-/,我希望-优先于/以便首先找到这些字符。在常规角色类中,[+-/]它不会在乎,并且总是先匹配/,尽管我想先匹配+

如何在一个正则表达式中做到这一点?我的实际用例有大约 10 个符号,我想搜索每个具有不同优先级的符号,因此想要一些可维护的东西。

我认为正则表达式不适合这个,但我最终还是让它在某种程度上工作了。如果您有一组替代项,正则表达式引擎将按顺序尝试它们:

> /^(h|hello)(.*)$/.exec("hello")
["hello", "h", "ello"]

这使您可以设置某种优先级,但乍一看它不起作用,因为正则表达式引擎将在第一个匹配项后停止管理。

相反,您可以做的是创建一个正则表达式,其中每个替代项最终匹配整个字符串,如下所示:

> /^(.*)(+)(.*)$|^(.*)(-)(.*)$|^(.*)(/)(.*)$/.exec("a / b + c - e = d")
["a / b + c - e = d", "a / b ", "+", " c - e = d", undefined, undefined, undefined, undefined, undefined, undefined]

如您所见,它倾向于第一种选择,(.*)(+)(.*) .如果你要在现实生活中使用它(尽管我希望你能转向真正的词法分析和解析器!),你可能想要明确地使左通配符或右通配符不那么贪婪,这样你就可以明确地说明关联性。还要记住,这不考虑括号中的术语,我不确定你甚至可以得到一个正则表达式来做到这一点。

最新更新