我必須刪除兩個分隔符之間的字符串,即 從「123XabcX321」我想要「123321」。 對於一個簡單的例子,我很好:「渴望」正則表達式匹配
$_=<>;
s/X(.*)X//;
print;
但如果有像「123XabcXasdfjXasdX321」輸入的不確定性,它與最近的X第X相匹配,並且我得到「123321」,但我想「 123asdfj321" 。 有沒有辦法指定一個匹配第一個有效分隔符而不是最後一個匹配的「熱切」匹配?
我必須刪除兩個分隔符之間的字符串,即 從「123XabcX321」我想要「123321」。 對於一個簡單的例子,我很好:「渴望」正則表達式匹配
$_=<>;
s/X(.*)X//;
print;
但如果有像「123XabcXasdfjXasdX321」輸入的不確定性,它與最近的X第X相匹配,並且我得到「123321」,但我想「 123asdfj321" 。 有沒有辦法指定一個匹配第一個有效分隔符而不是最後一個匹配的「熱切」匹配?
它通常被稱爲「不真實」,你把一個?在量詞後面:s/X(.*?)X//;
如果可以,請避免使用非貪婪修飾符。使用它可能會導致「意外」結果,因爲添加?
實際上並不妨礙.*
匹配任何內容。例如,
$ perl -le'print for "XaXbXY" =~ /X(.*?)XY/;'
aXb
爲了避免匹配X
,您可以使用以下命令:
s/X[^X]*X//g;
如果X
真是了不起大於一個字符,你可以使用以下命令:
s/X(?:(?!X).)*X//g;
有趣...我會嘗試。在我的情況下,X是不止一個字符。我需要解碼?:(?!X)tho – GClaramunt 2011-03-28 23:20:48
@GClaramunt,'(?:)'在正則表達式中類似於Perl中的'()'。在這種情況下,它表示'*'影響'(?!X).'而不是'.'。 '()'經常被濫用於此目的。 – ikegami 2011-03-29 22:53:02
@GClaramunt,'(?!)'檢查後面的內容與包含的模式不匹配。 – ikegami 2011-03-29 22:53:50
並且在給出的例子中,/ g需要多次替換。 – ysth 2011-03-28 03:06:05
我認爲「非貪心」是更常見的術語。無論如何,默認值是貪婪匹配,而你想要的是相反的。 – cjm 2011-03-28 03:39:18
謝謝,那就是我正在尋找的 – GClaramunt 2011-03-28 23:18:48