我在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中正常运行?
JavaScript不支持命名捕获组 (?<number>)
正如这个问题所建议的那样,正则表达式可能不适合这项工作.但是,如果您只想匹配最外面的括号组,则可以使用此方法
/\([^)]*(\s?\))*\)/g
Run Code Online (Sandbox Code Playgroud)
假设您给定的正则表达式是.NET 正则表达式,则 JavaScript 不支持以下语法组件:
\n\n(?>\xe2\x80\xa6)\xe2\x80\x93非回溯子表达式 (?<name>\xe2\x80\xa6)\xe2\x80\x93命名匹配子表达式(?<name1-name2>\xe2\x80\xa6)\xe2\x80\x93平衡组定义(?(name)\xe2\x80\xa6)\xe2\x80\x93条件组要使用 JavaScript 获得相同的结果,您\xe2\x80\x99 需要自己进行平衡:
\n\nvar 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}\nRun Code Online (Sandbox Code Playgroud)\n