这个正则表达式如何与JavaScript兼容?

Muh*_*man 5 javascript regex

我在Expresso中找到了一个正则表达式模板,这个工作正常并且返回完美的匹配但是在JavaScript中它不起作用.我知道它可能是为了后视,但我在Regex中的效率不足以使它与JS兼容.

\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)
Run Code Online (Sandbox Code Playgroud)

我想把它与......相匹配

max(50, max(51, 60)) a() MAX(s,4,455)something
Run Code Online (Sandbox Code Playgroud)

......它应该回归......

1: (50, max(51, 60))

2: ()

3: (s,4,455)
Run Code Online (Sandbox Code Playgroud)

这在Expresso中完美运行,但Chrome中的JS控制台说:

Uncaught SyntaxError: Invalid regular expression: /\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)/: Invalid group
Run Code Online (Sandbox Code Playgroud)

如何修改此正则表达式以在JavaScript中正常运行?

Pau*_*der 6

JavaScript不支持命名捕获组 (?<number>)

正如这个问题所建议的那样,正则表达式可能不适合这项工作.但是,如果您只想匹配最外面的括号组,则可以使用此方法

/\([^)]*(\s?\))*\)/g
Run Code Online (Sandbox Code Playgroud)

http://refiddle.com/114上查看它


Gum*_*mbo 4

假设您给定的正则表达式是.NET 正则表达式,则 JavaScript 不支持以下语法组件:

\n\n\n\n

要使用 JavaScript 获得相同的结果,您\xe2\x80\x99 需要自己进行平衡:

\n\n
var parts = str.match(/[()]|[^()]+/g),\n    matches = [],\n    balance = 0;\nfor (var i=0, j=0; i<parts.length; i++) {\n    switch (parts[i]) {\n    case "(":\n        if (balance === 0) {\n            j = i;\n        }\n        balance++;\n        break;\n    case ")":\n        if (balance === 1) {\n            matches.push(parts.slice(j, i+1).join(""));\n        }\n        balance--;\n        if (balance < 0) {\n            throw new EvalError(\'parentheses are not balanced; unexpected "("\');\n        }\n        break;\n    }\n}\nif (balance > 0) {\n    throw new EvalError(\'parentheses are not balanced; missing ")"\');\n}\n
Run Code Online (Sandbox Code Playgroud)\n