2009-06-22 93 views
1

我想仅使用正则表达式提取字符串的某些元素,并且我想只以捕获的组结束。如何只替换正则表达式的捕获元素?

例如,我想对像"This is a test"这样的字符串运行诸如(is|a)的东西,并且只能返回"is is a"。我可以部分做到这一点,现在唯一的办法是,如果我找到字符串的整个开头和结尾,但不抓住它:

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

然而,当我这样做,只是之前的最后的文字中发现/被俘的群体被淘汰 - 在最后找到的群体之后的一切都依然存在

is is a test. 

我如何可以隔离并替换仅仅根据所捕捉的字符串(这样我结束了"is is a"),在这两个PHP和Perl?

谢谢!

编辑: 我现在看到它是更好地使用m//而非s///,但我怎么可以应用到PHP的preg_match?在我真正的正则表达式中,我有几个捕获组,导致$1,$2, $3等 - preg_match只处理一个捕获组,对吧?

回答

5

如果所有你想要的是匹配,那么不需要运算符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并指定一个数组来保存比赛结果文档。

+0

工作! preg_match_all是关键。谢谢! – Andrew 2009-06-23 09:02:53

0

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

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

这还只是让我“是一个测试”... ... – Andrew 2009-06-22 20:20:24

1

您不能仅替换捕获。 s///总是替代比赛中包含的所有内容。您需要捕获其他项目并将其包含在替换项中或使用断言来要求比赛中包含不是

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