我意识到我没有让这个头衔足够好,但我没有变得更好。
假设有一个字符串
$str = "(aa)(bb)(cc)(dd)(ee)";
也就是说,有一些子串,用括号括起来,括号组之间没有空格,比如()(),但是在括号内,我写了aa,bb,cc等等,可以有空格。括号可以嵌套,但这不是绝对重要的。但是括号组数量不明。
现在我想将字符串拆分为一个字符串数组,每个元素都有一个(平衡的)括号内的元素。就是这样,
# @arr contains now ("(aa)", "(bb)", "(cc)" .. etc)
当然我可以实现一个基于计数器的方法,但是不会perl,perl,有一些内置的方法吗?我不太清楚这个特殊的操作是如何调用的,所以我不知道该找什么,字符串拆分太笼统,不是吗?
编辑:在perl中拆分括号delimmited字符串< ---搜索这不会给我任何有用的东西,我想这是因为它不是真的被DELIMITED,封闭了吗?
答案 0 :(得分:1)
@arr= map { "$_)" } split /\)/, $str;
此方法剥离结束括号,但随后将其添加回来。
另一种方法是在正则表达式上使用'global'标志,它返回所有匹配。
@arr= ( $str =~ /\([^)]*\)/g )
答案 1 :(得分:1)
有几个建议。
例如第一个:
use strict;
my $str = "(aa)(bb)(cc)(dd)(ee)";
my @arr;
while ($str =~ /(\(.*?\))/ig) {
push @arr, $1;
};
答案 2 :(得分:1)
如果我们忽略嵌套,您要执行的操作将分为)
和(
。
my @arr = split /(?<=\()(?=\()/, $str;
您也可以提取零件,而不是拆分。
my @arr = $str =~ /( \( [^()]* \) )/xg;
匹配嵌套的parens只是递归地应用这个正则表达式模式的问题。
my @arr = $str =~ /\G ( \( (?: [^()]++ | (?1) )* \) )/xg;