我正在尝试同时删除并存储(进入数组)字符串中某些正则表达式的所有匹配项。 要将字符串中的匹配项返回到数组中,可以使用
my @matches = $string=~/$pattern/g;
我想对替换正则表达式使用类似的模式。当然,一个选项是:
my @matches = $string=~/$pattern/g;
$string =~ s/$pattern//g;
但如果没有在整个字符串上运行两次正则表达式引擎,真的没有办法做到这一点吗?像
这样的东西my @matches = $string=~s/$pattern//g
除了这只会返回子数,不管列表上下文如何。作为一个安慰奖,我还会采用一种方法来使用qr //我可以简单地将引用的正则表达式修改为子正则表达式,但我不知道这是否可能(并且这不会妨碍搜索相同的字符串两次)。
答案 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.",
)