我知道了嗎?操作員啓用「非貪婪」模式,但我遇到了一個問題,我似乎無法繞開。考慮像這樣的字符串:最短匹配問題
my $str = '<a>sdkhfdfojABCasjklhd</a><a>klashsdjDEFasl;jjf</a><a>askldhsfGHIasfklhss</a>';
那裏有開始和結束標記<a>
和</a>
,有鑰匙ABC,DEF和GHI,但其他一些隨機文本包圍。例如,我想用<b>TEST</b>
替換<a>klashsdjDEFasl;jjf</a>
。但是,如果我有這樣的事情:
$str =~ s/<a>.*?DEF.*?<\/a>/<b>TEST><\/b>/;
即使非貪婪操作符*?這並不做我想做的。我知道爲什麼它沒有這樣做,因爲第一個<a>
匹配字符串中的第一個匹配項,並一直匹配到DEF,然後匹配到最接近的關閉</a>
。然而,我想要的是儘可能匹配最接近的開頭<a>
並關閉</a>
到「DEF」。所以目前,我得到這個作爲結果:
<a>TEST</b><a>askldhsfGHIasfklhss</a>
凡爲我尋找的東西得到這樣的結果:
<a>sdkhfdfojABCasjklhd</a><b>TEST</b><a>askldhsfGHIasfklhss</a>
順便說一句,我並不是想在這裏解析HTML,我知道有模塊可以做到這一點,我只是問如何做到這一點。
感謝, 埃裏克·塞弗特
謝謝,這正是我一直在尋找的。 – 2011-04-22 17:20:01