假设我有以下字符串:"a / b + c - e = d"
.
我想匹配以下任何一个:+
, /
, -
. 但是我想+
优先于-
and /
,我想-
优先于,/
以便首先找到这些字符。在常规字符类[+-/]
中,它不会关心并且总是/
首先匹配,尽管我想首先匹配+
。
如何在一个正则表达式中做到这一点?我的实际用例有大约 10 个符号,我想以不同的优先级搜索每个符号,所以想要一些可以维护的东西。
假设我有以下字符串:"a / b + c - e = d"
.
我想匹配以下任何一个:+
, /
, -
. 但是我想+
优先于-
and /
,我想-
优先于,/
以便首先找到这些字符。在常规字符类[+-/]
中,它不会关心并且总是/
首先匹配,尽管我想首先匹配+
。
如何在一个正则表达式中做到这一点?我的实际用例有大约 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]
如您所见,它支持第一种选择,(.*)(\+)(.*)
. 如果您要在现实生活中使用它(尽管我希望您会转向真正的词法分析器和解析器!),您可能希望明确地使左通配符或右通配符不那么贪婪,这样您就可以明确地了解关联性。还要记住,这不考虑括号内的术语,我不确定你甚至可以得到一个正则表达式来做到这一点。