正则表达式:优先匹配?

时间:2013-10-20 00:38:25

标签: javascript regex

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

我想匹配以下任何内容:+/-。不过,我希望+优先于-/,我希望-优先于/,以便首先找到这些字符。在常规字符类[+-/]中,尽管我希望首先匹配/,但它始终不会关注+

如何在一个正则表达式中执行此操作?我的实际用例有大约10个符号,我想用不同的优先级搜索每个符号,所以想要一些可以维护的东西。

1 个答案:

答案 0 :(得分:4)

我不认为正则表达式适合这一点,但我最终还是让它有点工作。如果您有一组备用项,则正则表达式引擎将按顺序尝试它们:

> /^(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]

正如您所看到的,它有利于第一种选择,(.*)(\+)(.*)。如果你在现实生活中使用它(虽然我希望你会转向真正的词法分析器和解析器!),你可能想要明确地使左通配符或右通配符不那么贪婪,这样你就可以明确关于关联性。另请注意,这并不考虑带括号的术语,我不确定您是否可以获得正则表达式来执行此操作。