perl正则表达式匹配问题

时间:2017-03-12 23:40:40

标签: perl

我在RegEx匹配中遇到问题。

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> ---

问题:

我想要的是使用正则表达式提取3件事。输出应该是这样的 CRP ---:直接抑制:内皮细胞一氧化氮--- facs;

请告诉我是什么问题,因为$ 2在第一个块之后打印任何东西,并且正则表达式与第二个部分不匹配。 感谢

1 个答案:

答案 0 :(得分:0)

要获得所需的匹配项,您需要在正则表达式中使用非正式量词,即将.+替换为.+?

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

根据perlretut

  

有时贪婪不好。有时,我们希望量词   匹配一小块字符串,而不是最大的一块。为了这   目的,拉里沃尔创造了最小的比赛或非贪婪   量词? ,*? ,+?和{}?这些是通常的量词   用一个?附在他们身上。它们具有以下含义:

     

[...]

     
      
  • α+β意思是:匹配&#39; a&#39; 1次或多次,即至少一次,但尽可能少次
  •