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

前端之家收集整理的这篇文章主要介绍了这个正则表达式如何与JavaScript兼容?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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 ")"');
}

猜你在找的正则表达式相关文章