加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 06:08:04 所属栏目:百科 来源:网络整理
导读:我在Expresso中找到了一个正则表达式模板,这个工作正常并且返回完美的匹配但是在 JavaScript中它不起作用.我知道它可能是为了后视,但我在Regex中的效率不足以使它与JS兼容. ((?[^()]+|((?number)|)(?-number))*(?(number)(?!))) 我想把它与……相匹配 ma
我在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 ")"');
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读