获取重复的正则表达式匹配
Get repeated regex matches
我有一个字符串,例子
my $str = "Dave birthday on 11/12/68 Fred enjoys cooking Wilma likes cake"
我有一些字符串我想匹配它们的名称和文本直到下一次匹配,所以我目前正在尝试
my $re = "(Dave|Sally|Fred|John|Wilma)" # created dynamically
我可以像这样重复匹配
my @matches;
push @matches, [, ] while $str =~ /$re/g;
warn Dumper @matches;
不确定我要投入多少才能取出 2 美元
这会抓取匹配项,但我正在尝试找到一种方法来匹配下一场匹配项之间的部分,所以理想情况下我会得到类似的东西(不管它是不是数组,散列或其他)。
[["Dave"," birthday on 11/12/68"],
["Fred"," enjoys cooking"],
["Wilma"," likes cake"]]
我可能可以通过在匹配位置和余数上拆分字符串来做到这一点,但我想知道是否有任何明显的正则表达式方式我错过了?
使用前瞻断言,以便下一次搜索在上一次搜索结束的名称之前开始。
#! /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, [ , ] while $str =~ /$re/g;
use Data::Dumper; print Dumper \@matches;
使用 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;
我有一个字符串,例子
my $str = "Dave birthday on 11/12/68 Fred enjoys cooking Wilma likes cake"
我有一些字符串我想匹配它们的名称和文本直到下一次匹配,所以我目前正在尝试
my $re = "(Dave|Sally|Fred|John|Wilma)" # created dynamically
我可以像这样重复匹配
my @matches;
push @matches, [, ] while $str =~ /$re/g;
warn Dumper @matches;
不确定我要投入多少才能取出 2 美元
这会抓取匹配项,但我正在尝试找到一种方法来匹配下一场匹配项之间的部分,所以理想情况下我会得到类似的东西(不管它是不是数组,散列或其他)。
[["Dave"," birthday on 11/12/68"],
["Fred"," enjoys cooking"],
["Wilma"," likes cake"]]
我可能可以通过在匹配位置和余数上拆分字符串来做到这一点,但我想知道是否有任何明显的正则表达式方式我错过了?
使用前瞻断言,以便下一次搜索在上一次搜索结束的名称之前开始。
#! /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, [ , ] while $str =~ /$re/g;
use Data::Dumper; print Dumper \@matches;
使用 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;