获得重复的正则表达式匹配

时间:2016-11-18 12:42:56

标签: regex perl pcre

我有一个字符串,例如

* 1.0

我有一些字符串我希望在下一场比赛之前匹配他们的名字和文字,所以我正在尝试

my $str = "Dave birthday on 11/12/68 Fred enjoys cooking Wilma likes cake"

我可以重复比赛,如

my $re = "(Dave|Sally|Fred|John|Wilma)" # created dynamically

不确定我会用什么来拉出$ 2

这会抓住比赛,但是我试图找到一种方法来匹配中间到下一场比赛的部分,所以理想情况下我最终会得到类似的东西(如果它是一个阵列,请不要小心,哈希或者其他)。

my @matches;
push @matches, [$1, $2] while $str =~ /$re/g;
warn Dumper @matches;

我可以通过在匹配的位置和余数上分割字符串来做到这一点,但我想知道是否有任何明显的正则表达方式我错过了?

2 个答案:

答案 0 :(得分:3)

使用前瞻断言,以便下一次搜索在结束上一次搜索的名称之前开始。

#! /usr/bin/perl
use warnings;
use strict;
use feature 'say';

my $str = 'Dave birthday on 11/12/68 Fred enjoys cooking Wilma likes cake';
my $names_re  = qr/Dave|Sally|Fred|John|Wilma/;
my $re = qr/($names_re) (.*?)(?= $names_re|$)/;

my @matches;
push @matches, [ $1, $2 ] while $str =~ /$re/g;

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

答案 1 :(得分:1)

split与捕获组一起使用以生成哈希:

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper qw(Dumper);

my $str = 'Dave birthday on 11/12/68 Fred enjoys cooking Wilma likes cake';
my $names_re = qr/(Dave|Sally|Fred|John|Wilma)/;

my @parts = split /\s*\b$names_re\b\s*/, $str;
shift @parts;
my %result = @parts;

print Dumper \%result;