Javascript 正则表达式:优先匹配?

Javascript 正则表达式:优先匹配?,javascript,regex,Javascript,Regex,假设我有以下字符串:“a/b+c-e=d” 我想匹配以下任一项:+,/,-。但是,我希望+优先于-和/,我希望-优先于/,以便首先找到这些字符。在常规字符类[+-/]中,它不会在意,而且总是先匹配/,尽管我想先匹配+ 如何在一个正则表达式中实现这一点?我的实际用例有大约10个符号,我想用不同的优先级搜索每个符号,所以我想要一些可以维护的东西 我认为正则表达式不适合这种情况,但我最终还是让它在某种程度上发挥了作用。如果您有一组备选方案,正则表达式引擎将按顺序尝试它们: > /^(h|hell

假设我有以下字符串:
“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]

如您所见,它支持第一种选择,
(.*)(\+)(.*)
。如果要在现实生活中使用它(尽管我希望您可以使用真正的lexer和parser!),您可能希望显式地减少左通配符或右通配符的贪婪程度,以便显式地说明关联性。还要记住,这并不能解释括号中的术语,我甚至不确定你是否能得到一个正则表达式来做这件事。

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

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

如您所见,它支持第一种选择,
(.*)(\+)(.*)
。如果要在现实生活中使用它(尽管我希望您可以使用真正的lexer和parser!),您可能希望显式地减少左通配符或右通配符的贪婪程度,以便显式地说明关联性。还请记住,这并不能解释括号中的术语,我甚至不确定您是否可以获得一个正则表达式来实现这一点。

您可能需要将每个表达式作为单独的正则表达式运行。您可以尝试一个不间断的
switch
语句。我不知道匹配它们的顺序有多重要。你要解决的实际问题是什么?这在原则上是无法做到的,因为你无法提前知道除法会重复多少次。也就是说,您不能预先知道AST(抽象语法树)的高度。不过,您可以为此语法使用一些解析器生成器。例如,您可能需要将每个语句作为一个单独的正则表达式运行。您可以不间断地尝试
switch
语句。我看不出匹配它们的顺序有多重要。你要解决的实际问题是什么?这在原则上是无法做到的,因为你无法提前知道除法会重复多少次。也就是说,您不能预先知道AST(抽象语法树)的高度。不过,您可以为此语法使用一些解析器生成器。例如