我在Expresso中找到了一个正则表达式模板,这个工作正常并且返回完美的匹配但是在
JavaScript中它不起作用.我知道它可能是为了后视,但我在Regex中的效率不足以使它与JS兼容.
\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)
我想把它与……相匹配
max(50,max(51,60)) a() MAX(s,4,455)something
……它应该回归……
1: (50,60)) 2: () 3: (s,455)
这在Expresso中完美运行,但Chrome中的JS控制台说:
Uncaught SyntaxError: Invalid regular expression: /\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)/: Invalid group
如何修改此正则表达式以在JavaScript中正常运行?
解决方法
假设您的给定正则表达式是
.NET regular expression,JavaScript不支持以下语法组件:
>(?> …) – nonbacktracking subexpression
>(?< name> …) – named matched subexpressions
>(?< name1-name2> …) – balancing group definition
>(?(姓名)……) – conditional group
要使用JavaScript获得相同的结果,您需要自己进行平衡:
var parts = str.match(/[()]|[^()]+/g),matches = [],balance = 0; for (var i=0,j=0; i<parts.length; i++) { switch (parts[i]) { case "(": if (balance === 0) { j = i; } balance++; break; case ")": if (balance === 1) { matches.push(parts.slice(j,i+1).join("")); } balance--; if (balance < 0) { throw new EvalError('parentheses are not balanced; unexpected "("'); } break; } } if (balance > 0) { throw new EvalError('parentheses are not balanced; missing ")"'); }