这种括号匹配必须要求正则支持嵌套或者递归阿之类的东西
我有个简单的想法,就是用正则把所有匹配的括号都替换掉。。。
下面是用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("((()))((()))");
最后贴个图
再贴个我分享的代码: