如何仅替换正则表达式中捕获的元素?

时间:2009-06-22 20:10:49

标签: php regex perl

我正在尝试使用正则表达式仅提取字符串的某些元素,并且我希望最终仅使用捕获的组。

例如,我想在(is|a)这样的字符串上运行类似"This is a test"的内容,并且只能返回"is is a"。我现在可以部分执行的唯一方法是,如果我找到字符串的整个开头和结尾但是不捕获它:

.*?(is|a).*? replaced with $1

但是,当我这样做时,只会删除最终找到/捕获组之前的字符 - 最后找到的组之后的所有内容仍然存在。

is is a test.

如何在PHP和Perl中仅隔离和替换捕获的字符串(以便最终得到"is is a")?

谢谢!

修改 我现在看到最好使用m//而不是s///,但是如何将其应用于PHP的preg_match?在我的真正的正则表达式中,我有几个被捕获的组,导致$1$2$3等 - preg_match仅处理一个被捕获的组,对吧?

3 个答案:

答案 0 :(得分:6)

如果您想要的只是匹配项,则不需要s///运算符。您应该使用m//。如果以下示例不符合您的需求,您可能希望稍微扩展一下您的解释:

#!/usr/bin/perl

use strict;
use warnings;

my $text = 'This is a test';

my @matches = ( $text =~ /(is|a)/g );

print "@matches\n";
__END__

C:\Temp> t.pl
is is a

编辑:对于PHP,您应该使用preg_match_all并指定一个数组来保存匹配结果,如文档中所示。

答案 1 :(得分:1)

您无法仅替换捕获。 s///总是替换匹配中包含的所有内容。您需要捕获其他项并将其包含在替换项或使用断言中,以要求匹配中包含 的内容。

那就是说,我不认为这就是你真正要求的。 Sinan's answer你追求的是什么?

答案 2 :(得分:0)

您将所有内容都放入捕获中,然后只替换您想要的内容。

(.*?)(is|a)(.*?)