本文介绍了如何使用正则表达式匹配嵌套括号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
正如标题所述,这是示例输入:
As the title says, here is an example input:
(outer
(center
(inner)
(inner)
center)
ouer)
(outer
(inner)
ouer)
(outer
ouer)
当然,匹配的字符串将通过递归处理.
Of course, the matched strings will be processed by recursion.
我希望第一个递归匹配:
I want the first recursion to match:
[
(outer
(center
(inner)
(inner)
center)
ouer),
(outer
(inner)
ouer),
(outer
ouer)]
无需赘言……
推荐答案
许多正则表达式实现都不允许您匹配任意数量的嵌套.但是,Perl,PHP和.NET支持递归模式.
Many regex implementations will not allow you to match an arbitrary amount of nesting. However, Perl, PHP and .NET support recursive patterns.
Perl中的演示:
#!/usr/bin/perl -w
my $text = '(outer
(center
(inner)
(inner)
center)
ouer)
(outer
(inner)
ouer)
(outer
ouer)';
while($text =~ /(\(([^()]|(?R))*\))/g) {
print("----------\n$1\n");
}
将打印:
----------
(outer
(center
(inner)
(inner)
center)
ouer)
----------
(outer
(inner)
ouer)
----------
(outer
ouer)
或者,相当于PHP:
$text = '(outer
(center
(inner)
(inner)
center)
ouer)
(outer
(inner)
ouer)
(outer
ouer)';
preg_match_all('/(\(([^()]|(?R))*\))/', $text, $matches);
print_r($matches);
产生:
Array
(
[0] => Array
(
[0] => (outer
(center
(inner)
(inner)
center)
ouer)
[1] => (outer
(inner)
ouer)
[2] => (outer
ouer)
)
...
说明:
( # start group 1
\( # match a literal '('
( # group 2
[^()] # any char other than '(' and ')'
| # OR
(?R) # recursively match the entir pattern
)* # end group 2 and repeat zero or more times
\) # match a literal ')'
) # end group 1
编辑
注意@Goozak的评论:
EDIT
Note @Goozak's comment:
这篇关于如何使用正则表达式匹配嵌套括号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!