2009-06-22 90 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你在追求什麼?