Regex Perl嵌套括号表达式
如何使用perl正则表达式提取最外层括号内的内容 文本=((A+(B-C))) 输出=-(A+(B-C))Regex Perl嵌套括号表达式,regex,perl,nested,expression,parentheses,Regex,Perl,Nested,Expression,Parentheses,如何使用perl正则表达式提取最外层括号内的内容 文本=((A+(B-C))) 输出=-(A+(B-C)) 谢谢可以用这个(\(((((?:[^()]+++)(?1))*)\来完成它,有几个 如何做到这一点 输出 ** Grp 0 - ( pos 4 , len 16 ) (-(A + (B - C))) ** Grp 1 - ( pos 4 , len 16 ) (-(A + (B - C))) ** Grp 2 - ( pos 5 , len 14 ) -(
谢谢可以用这个
(\(((((?:[^()]+++)(?1))*)\
来完成它,有几个如何做到这一点 输出
** Grp 0 - ( pos 4 , len 16 )
(-(A + (B - C)))
** Grp 1 - ( pos 4 , len 16 )
(-(A + (B - C)))
** Grp 2 - ( pos 5 , len 14 )
-(A + (B - C))
我看不出需要比这更多的东西
use strict;
use warnings 'all';
my $text = "(-(A + (B - C)))";
my ($result) = $text =~ / \( (.*) \) /x;
print $result, "\n";
输出
该模式捕获从第一个左括号之后到最后一个右括号之前的所有内容。从你的问题来看,我认为没有必要检查字符串是否平衡我还没有测试它,但我希望以下速度更快,因为它只会在必须的时候尝试递归:
\([^()]*(?:\((?1)\)[^()]*)\)
@ikegami我认为+
应该让它们成为same@ikegami-是的,它似乎比交替快30%。这种展开的循环会遇到递归。这是不必要的复杂。OP并没有要求测试字符串以确保括号是平衡的,只是要求最外层对中的字符串是平衡的extracted@ikegami-您展开的递归循环太棒了!谢谢你的提示!
use strict;
use warnings 'all';
my $text = "(-(A + (B - C)))";
my ($result) = $text =~ / \( (.*) \) /x;
print $result, "\n";
-(A + (B - C))