perl正则表达式匹配问题

perl正则表达式匹配问题,perl,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>

我的正则表达式匹配有问题

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";
my$line='行号:8:8:'
. 'CRP:直接抑制:内皮细胞一氧化氮'
. '氧化物facs'
. 'crp:抑制:内皮细胞
. '细胞一氧化氮:置信度得分0.9017396427774064';
$line=~/(.+)(\)(.+)(\)(.+)(\)(.+)(\)(\)(.+)/;
打印“$3--$5--$7\n”;
输出为:

CRP ---: directly inhibits : endothelial cell nitric oxide <ENAMEX TYPE="GENE">facs</ENAMEX> ---
CRP---:直接抑制:内皮细胞一氧化氮facs---
问题:

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

请告诉我问题出在哪里,因为$2在第一块之后打印任何内容,而正则表达式与第二部分不匹配。
谢谢

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

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

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

[……]

  • a+?表示:匹配“a”1次或多次,即至少匹配一次,但次数应尽可能少

尝试使用非语法量词,即用
替换
+
。有关更多信息,请参阅。谢谢million@ary如果这个答案解决了你的问题,考虑接受它。看见