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

时间:2011-05-04 16:03:37

标签: javascript regex

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

\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\)

我希望将它与......匹配。

max(50, max(51, 60)) a() MAX(s,4,455)something

......它应该返回......

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

2: ()

3: (s,4,455)

这在Expresso中非常有效,但Chrome中的JS控制台说:

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

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

4 个答案:

答案 0 :(得分:6)

JavaScript不支持named capture groups (?<number>)

正如this question所述,正则表达式可能不适合这项工作。但是,如果您只想匹配最外面的括号组,则可以使用此

/\([^)]*(\s?\))*\)/g

http://refiddle.com/114

工作

答案 1 :(得分:4)

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

要使用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 ")"');
}

答案 2 :(得分:2)

Javascript中没有负面的背后隐藏。你必须找到另一种选择。

编辑:我再次看了你的RegEx,我以为我看到了负面的背后,但我想我没有。无论如何,我会将其留作信息用途。

答案 3 :(得分:0)

在javascript中,可以使用[0-9]或\ d定义数字 不是数字是[^ 0-9]或\ D

相关问题