我在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在第一个块之后打印任何东西,并且正则表达式与第二个部分不匹配。 感谢
答案 0 :(得分:0)
要获得所需的匹配项,您需要在正则表达式中使用非正式量词,即将.+
替换为.+?
:
$line =~ /(.+?)(\<ENAMEX[ ]TYPE\=\"GENE\"\>)(.+?)(\<\/ENAMEX\>)[ ]
(.+?)(\<ENAMEX[ ]TYPE\=\"GENE\"\>)(.+?)(\<\/ENAMEX\>)(.+?)/x;
根据perlretut
:
有时贪婪不好。有时,我们希望量词 匹配一小块字符串,而不是最大的一块。为了这 目的,拉里沃尔创造了最小的比赛或非贪婪 量词? ,*? ,+?和{}?这些是通常的量词 用一个?附在他们身上。它们具有以下含义:
[...]
- α+β意思是:匹配&#39; a&#39; 1次或多次,即至少一次,但尽可能少次