我正在尝试使用正则表达式仅提取字符串的某些元素,并且我希望最终仅使用捕获的组。
例如,我想在(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
仅处理一个被捕获的组,对吧?
答案 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)(.*?)