我试图使用正则表达式只提取字符串的某些元素,并且只想得到捕获的组。
例如,我希望在像"This is a test"
这样的字符串上运行类似于"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
只处理一个捕获的组,对吗?
发布于 2009-06-22 12:22:53
如果只需要匹配,则不需要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
并指定一个数组来保存匹配结果,如文档所示。
发布于 2009-06-22 12:26:58
你不能只替换捕获。s///
总是替换比赛中包含的所有内容。您需要捕获附加项并将它们包含在替换项中,或者使用断言来要求不包含在匹配中的内容。
尽管如此,我不认为这是你真正想要的。Sinan's answer是你要找的吗?
发布于 2009-06-22 12:14:24
你把所有的东西都投入到捕获中,然后只替换你想要的。
(.*?)(is|a)(.*?)
https://stackoverflow.com/questions/1029159
复制相似问题