2017-03-12 238 views
-1

我在RegEx匹配中遇到問題。perl正則表達式匹配問題

my $line = 'Line no. : 8 : 8 : <ENAMEX TYPE="GENE">' 
    . 'CRP</ENAMEX> : directly inhibits : endothelial cell nitric' 
    . 'oxide <ENAMEX TYPE="GENE">facs</ENAMEX>' 
    . '<ENAMEX TYPE="GENE">crp</ENAMEX>:inhibit:endothelial' 
    . 'cell nitric oxide :Confidence Score 0.9017396427774064'; 

$line =~ /(.+)(\<ENAMEX TYPE\=\"GENE\"\>)(.+)(\<\/ENAMEX\>) (.+)(\<ENAMEX TYPE\=\"GENE\"\>)(.+)(\<\/ENAMEX\>)(.+)/; 

print "$3 ---$5 ---$7\n"; 

,輸出是:

CRP ---: directly inhibits : endothelial cell nitric oxide <ENAMEX TYPE="GENE">facs</ENAMEX> --- 

問題:

我想是提取使用正則表達式的三兩件事。輸出應該是類似於 CRP ---:直接抑制:內皮細胞一氧化氮--- facs;

請告訴我什麼是問題,因爲$ 2在第一個塊之後打印任何東西,並且正則表達式與第二個部分不匹配。 感謝

+0

嘗試使用nongreedy量詞,即更換'+'與'+'。?。請參閱['perlretut'](http://perldoc.perl.org/perlretut.html)以獲取更多信息 –

+1

YUp這是有效的。謝謝百萬 – ary

回答

0

爲了得到您想要的比賽,你需要使用一個nongreedy量詞,即與.+?取代.+,在您的正則表達式:

$line =~ /(.+?)(\<ENAMEX[ ]TYPE\=\"GENE\"\>)(.+?)(\<\/ENAMEX\>)[ ] 
     (.+?)(\<ENAMEX[ ]TYPE\=\"GENE\"\>)(.+?)(\<\/ENAMEX\>)(.+?)/x; 

根據perlretut

有時貪婪不好。有時,我們希望量詞到 匹配最小的一串,而不是最大的一塊。對於這個 的用途,Larry Wall創建了最小匹配還是非貪心 量詞? ,*? ,+?和{} ?.這些是通常的量詞 與?附加到他們。它們具有以下含義:

[...]

  • A +?指:匹配「一個」 1次或多次,即,至少一次,但儘可能少的次數儘可能
+0

@ary如果這個答案解決了你的問題,考慮接受它。請參閱[當某人回答我的問題時該怎麼辦?](http://stackoverflow.com/help/someone-answers) –