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

How can this regex be made JavaScript compatible?

本文关键字:JavaScript 兼容 正则表达式 何使这      更新时间:2023-09-26

我在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中正常工作?

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

正如这个问题所建议的,regex可能不是适合这项工作的工具。但是,如果您只想匹配最外层的括号组,则可以使用

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

见http://refiddle.co/114

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

  • (?>…) -非回溯子表达式
  • (?<name>…) -命名匹配子表达式
  • (?<name1-name2>…) -平衡组定义
  • (?(name)…) -条件组

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

Javascript中没有消极的向后看。你得另找办法。

编辑:我又看了你的RegEx,我以为我看到了消极的目光,但我想我没有。不管怎样,我将把这个留作参考。

在javascript中,数字可以用[0-9]或'd来定义没有数字是[^0-9]或'D