Perl正则表达式从替换返回匹配

时间:2013-12-19 18:23:12

标签: regex perl substitution

我正在尝试同时删除并存储(进入数组)字符串中某些正则表达式的所有匹配项。 要将字符串中的匹配项返回到数组中,可以使用

my @matches = $string=~/$pattern/g;

我想对替换正则表达式使用类似的模式。当然,一个选项是:

my @matches = $string=~/$pattern/g;
$string =~ s/$pattern//g;

但如果没有在整个字符串上运行两次正则表达式引擎,真的没有办法做到这一点吗?像

这样的东西
my @matches = $string=~s/$pattern//g

除了这只会返回子数,不管列表上下文如何。作为一个安慰奖,我还会采用一种方法来使用qr //我可以简单地将引用的正则表达式修改为子正则表达式,但我不知道这是否可能(并且这不会妨碍搜索相同的字符串两次)。

2 个答案:

答案 0 :(得分:6)

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

use warnings;
use strict;

my $string  = 'I thistle thing am thinking this Thistle a changed thirsty string.';
my $pattern = '\b[Tt]hi\S+\b';

my @matches;
$string =~ s/($pattern)/push @matches, $1; ''/ge;

print "New string: $string; Removed: @matches\n";

输出:

New string: I   am    a changed  string.; Removed: thistle thing thinking this Thistle thirsty

答案 1 :(得分:1)

这是另一种方法,可以在替换中执行Perl代码。诀窍在于s///g将一次返回一个捕获,如果不匹配则undef,从而退出while循环。

use strict;
use warnings;
use Data::Dump;

my $string = "The example Kenosis came up with was way better than mine.";
my @matches;

push @matches, $1 while $string =~ s/(\b\w{4}\b)\s//;

dd @matches, $string;

__END__

(
  "came",
  "with",
  "than",
  "The example Kenosis up was way better mine.",
)