2017-03-12 195 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) –