在perl中使用移位模式拆分字符串

时间:2014-04-18 10:07:33

标签: regex string perl split

我有:

my $string = aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh";

我希望将此字符串拆分为:

aaaa    
bbbb
cccc dddd eeee
ffff
gggg hhhh

我如何使用拆分来做到这一点?

我认为它应该看起来像这样的伪代码:

split(/IF ONWARD SYMBOL " APPEARS EVENT COUNT DO PATTERN: \s ELSE: "/ $string);

注意:需要保留字符串中的字符顺序

4 个答案:

答案 0 :(得分:4)

您可以使用Perl核心库中的便捷模块Text::ParseWords来执行此操作:

use strict;
use warnings;
use Data::Dumper;
use Text::ParseWords;

my $string = qq(aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh");
my @parts = quotewords('\s+', 0, $string);
print Dumper \@parts;

<强>输出:

$VAR1 = [
          'aaaa',
          'bbbb',
          'ccccc ddddd eeee',
          'fffff',
          'ggggg hhhh'
        ];

答案 1 :(得分:1)

最好使用全局正则表达式将字符串分为引用和非引用部分。

不是使用split
use strict;
use warnings;

my $string = 'aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh"';

my @split = $string =~ / " [^"]* " | \S+ /xg;

print "$_\n" for @split;

<强>输出

aaaa
bbbb
"ccccc ddddd eeee"
fffff
"ggggg hhhh"

答案 2 :(得分:0)

您可以分别匹配单词内部和双面引号,并在循环中使用/g,如下所示:

#!/usr/bin/perl

use strict;
use warnings;

my $string = 'aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh"';

while ($string =~ m/(\w+)|"([^"]+)"/g) {
    print $1 || $2, "\n";
}

运行:

$ perl t.pl 
aaaa
bbbb
ccccc ddddd eeee
fffff
ggggg hhhh

顺便说一句,您只需一行即可实现上述目标:

@field = grep { defined } ( $string =~ m/(\w+)|"([^"]+)"/g );

答案 3 :(得分:0)

分裂的方式:

use strict;
use warnings;

my $string = '"aaaa" bbbb kkkk "ccccc ddddd eeee" fffff eeee "ggggg hhhh"';

my @res = grep {$_} split(/ *"([^"]*)" *| +/, $string);

print join($/, @res);