perl分裂字符串

时间:2014-02-08 18:46:36

标签: perl parentheses string-split

我意识到我没有让这个头衔足够好,但我没有变得更好。

假设有一个字符串

$str = "(aa)(bb)(cc)(dd)(ee)";

也就是说,有一些子串,用括号括起来,括号组之间没有空格,比如()(),但是在括号内,我写了aa,bb,cc等等,可以有空格。括号可以嵌套,但这不是绝对重要的。但是括号组数量不明。

现在我想将字符串拆分为一个字符串数组,每个元素都有一个(平衡的)括号内的元素。就是这样,

# @arr contains now ("(aa)", "(bb)", "(cc)" .. etc)

当然我可以实现一个基于计数器的方法,但是不会perl,perl,有一些内置的方法吗?我不太清楚这个特殊的操作是如何调用的,所以我不知道该找什么,字符串拆分太笼统,不是吗?

编辑:在perl中拆分括号delimmited字符串< ---搜索这不会给我任何有用的东西,我想这是因为它不是真的被DELIMITED,封闭了吗?

3 个答案:

答案 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;