gpt4 book ai didi

regex - 如何使用正则表达式匹配嵌套括号?

转载 作者:行者123 更新时间:2023-12-03 12:01:59 26 4
gpt4 key购买 nike

正如标题所说,这是一个示例输入:

 (outer
(center
(inner)
(inner)
center)
ouer)
(outer
(inner)
ouer)
(outer
ouer)

当然,匹配的字符串会被递归处理。

我希望第一个递归匹配:
 [
(outer
(center
(inner)
(inner)
center)
ouer),
(outer
(inner)
ouer),
(outer
ouer)]

后面的过程就不用说了……

最佳答案

许多正则表达式实现不允许您匹配任意数量的嵌套。但是,Perl、PHP 和 .NET 支持递归模式。

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)

Or, the PHP equivalent:

$text = '(outer
(center
(inner)
(inner)
center)
ouer)
(outer
(inner)
ouer)
(outer
ouer)';

preg_match_all('/(\(([^()]|(?R))*\))/', $text, $matches);

print_r($matches);

它产生:

大批
(
[0] => 数组
(
[0] =>(外
(中央
(内)
(内)
中央)
哦)
[1] =>(外
(内)
哦)
[2] =>(外
哦)
)

...

一个解释:

( # 开始第 1 组
\( # 匹配一个文字 '('
(#第2组
[^()] # '(' 和 ')' 以外的任何字符
| # 或者
(?R) # 递归匹配整个模式
)* # 结束第 2 组并重复零次或多次
\) # 匹配文字 ')'
) # 结束组 1

编辑

注意@Goozak 的评论:

A better pattern might be \(((?>[^()]+)|(?R))*\) (from PHP:Recursive patterns). For my data, Bart's pattern was crashing PHP when it encountered a (long string) without nesting. This pattern went through all my data without problem.

关于regex - 如何使用正则表达式匹配嵌套括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14952113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com