请问正则如何匹配多层成对的括号?
高洛峰
高洛峰 2016-11-11 12:59:40
0
2
919
"()" => returns true
")(()))" => returns false
"(" => returns false
"(())((()())())" => returns true

形如这种,我可以做到匹配2,3层的没问题,但是层数多了就不知道该怎么办了


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(2)
三叔

这种括号匹配必须要求正则支持嵌套或者递归阿之类的东西

我有个简单的想法,就是用正则把所有匹配的括号都替换掉。。。

下面是用perl6 实现的,如果看不懂理解一下想法就好了。。。

#!/usr/bin/env perl6
 
use v6;
 
my \stdin = $*IN;
 
my Int $count = +stdin.get();
 
for ^$count {
    my Str $str = stdin.get();
 
    while $str.chars > 0 {
        last unless $str ~~ s:g/[ \[ \] || \( \) ]+//; ## 去掉所有匹配的括号
    }
 
    say $str.chars ?? "No" !! "Yes"; ##如果 还存在不能去除的字符,说明匹配失败 。。
}

嵌套是这样子的。。

#!/usr/bin/env perl6

grammar Bracket { ## 语法类型  *匹配0或以上 +匹配1或以上
    rule TOP {
        * 
    }
    token pair { # 匹配 
 或者 是 +
        
 |         +
    }     token bl {          # 匹配 '(' 或者  '['     }     token br {          # 匹配 ')' 或者 ']'     } } ## 测试语句 匹配上就打印匹配得到的语法树 匹配不到就是Nil say Bracket.parse("()"); say Bracket.parse('(()'); say Bracket.parse("(((((())))))"); say Bracket.parse("((()))((()))");

最后贴个图

bVFkzX.png

学霸

维护一个计数器,如果是左括号加1,右括号减一,最后判断计数器是否等于0。

function match(str) {
    var n = 0;
    for (s of str) {
        if (s === '(') {
            n++;
        } 
        if (s === ')') {
            if (n === 0) {
                return false;
            }
            n--;
        }
    }
    return n === 0;
}


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template