如何从Perl中的字符串中提取单个字符或封闭的分组?

时间:2009-09-21 14:32:19

标签: regex perl split

我想拆分字符串:“Hello [You] All”

到以下数组:

H,e,l,l,o,[You],A,l,l

我尝试用split进行:

my $str = "Hello[You]All";
my @list = split(/(\[.*?\]|.)/, $str);

foreach (@list) {
    print "->$_\n";
}

因为我尝试了分裂不应该做的事情,所以它给了我以下数组:

,H,,e,,l,,l,,o,,[You],,A,,l,,l,

我需要采取的下一步是删除空格。

虽然它不是最好的解决方案,但它是我找到的唯一解决方案,没有任何太混乱。 我在这里发帖询问是否有人知道更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:8)

my $str = "Hello[You]All";
my @list = $str =~ /(\[.*?\]|.)/g;

foreach (@list) {
    print "->$_\n";
}

也就是说:你不需要拆分你正在使用的模式(导致那些空元素,因为它们是使用你的模式作为分隔符拆分出来的实际文本);你只需要为你的模式提取所有匹配项。哪个在数组上下文中进行全局(/g)模式匹配呢。

答案 1 :(得分:5)

你可以grep非空元素的结果;

my @list = grep /./, split(/(\[.*?\]|.)/, $str);

或者,

my @list = $str =~ /\[.*?\]|./g;

答案 2 :(得分:1)

虽然我认为混乱的答案在这里是正确的,但为了完整起见,这是使用splitgrep实现目标的一种方式:

#!/usr/bin/perl

use strict;
use warnings;

my $x = "Hello[You]All";
my @x = grep { defined } split qr{(\[.+\])|}, $x;

use Data::Dumper;
print Dumper \@x;

使用此模式,split分割括号内的字符(您没有提及"a[]b"是否为有效输入)或空字符串和grep过滤器{{1}而不是真值。