正则表达式只与开始匹配

时间:2014-01-14 16:22:20

标签: regex perl

我很喜欢在perl中捕获多个具有明确匹配的单词,例如:

$string="dasd 341312 ddas 42 fsd 5345";
@numbers=$string=~/(\d+)/g;

这会在我的字符串中返回一个数字数组。

我有这种形式的数据:

random
text
START=somenumber
lines
of
text
here
START=someothernumber
other
text
here
START=thirdnumber
more
text
...

如何捕获以START=开头并继续(多线)直到下一个START=(没有它)的所有数据块的数组。

所以例如:

$array[1] = "    START=someothernumber
             other
             text
             here"

2 个答案:

答案 0 :(得分:0)

也许以下内容会有所帮助:

use strict;
use warnings;
use Data::Dumper;

my $data = do { local $/; <DATA> };
my @array = $data =~ /(START=.+?)(?=START=|\z)/gs;
print Dumper \@array;

__DATA__
random
text
START=somenumber
lines
of
text
here
START=someothernumber
other
text
here
START=thirdnumber
more
text

输出:

$VAR1 = [
          'START=somenumber
lines
of
text
here
',
          'START=someothernumber
other
text
here
',
          'START=thirdnumber
more
text
'
        ];

答案 1 :(得分:0)

有一种简单的方法可以做到这一点。打开多行和全局替换,然后记住你必须处理新行(这是解开它的关键)。这将解决您的问题:

while ($string =~ /^.*?START=([\w\s\n]*$)/mg) { print $1,"\n"; }