2011-03-28 61 views
11

我必須刪除兩個分隔符之間的字符串,即 從「123XabcX321」我想要「123321」。 對於一個簡單的例子,我很好:「渴望」正則表達式匹配

$_=<>; 
s/X(.*)X//; 
print; 

但如果有像「123XabcXasdfjXasdX321」輸入的不確定性,它與最近的X第X相匹配,並且我得到「123321」,但我想「 123asdfj321" 。 有沒有辦法指定一個匹配第一個有效分隔符而不是最後一個匹配的「熱切」匹配?

回答

28

它通常被稱爲「不真實」,你把一個?在量詞後面:s/X(.*?)X//;

+1

並且在給出的例子中,/ g需要多次替換。 – ysth 2011-03-28 03:06:05

+0

我認爲「非貪心」是更常見的術語。無論如何,默認值是貪婪匹配,而你想要的是相反的。 – cjm 2011-03-28 03:39:18

+0

謝謝,那就是我正在尋找的 – GClaramunt 2011-03-28 23:18:48

6

如果可以,請避免使用非貪婪修飾符。使用它可能會導致「意外」結果,因爲添加?實際上並不妨礙.*匹配任何內容。例如,

$ perl -le'print for "XaXbXY" =~ /X(.*?)XY/;' 
aXb 

爲了避免匹配X,您可以使用以下命令:

s/X[^X]*X//g; 

如果X真是了不起大於一個字符,你可以使用以下命令:

s/X(?:(?!X).)*X//g; 
+0

有趣...我會嘗試。在我的情況下,X是不止一個字符。我需要解碼?:(?!X)tho – GClaramunt 2011-03-28 23:20:48

+0

@GClaramunt,'(?:)'在正則表達式中類似於Perl中的'()'。在這種情況下,它表示'*'影響'(?!X).'而不是'.'。 '()'經常被濫用於此目的。 – ikegami 2011-03-29 22:53:02

+0

@GClaramunt,'(?!)'檢查後面的內容與包含的模式不匹配。 – ikegami 2011-03-29 22:53:50