2017-03-12 27 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> --- 

問題:

私が欲しいものは、正規表現を使用して3つの事を抽出することです。出力は CRPのようなものだったはずです--- ---:内皮細胞の一酸化窒素--- facs;

$ 2が最初のブロックの後に何かを印刷していて、正規表現が2番目の部分と一致しないため、何が問題なのか教えてください。 ご希望の試合を取得するには感謝

+0

てみ '置き換えるすなわち、最短一致量指定子を使用するために、少なくとも一回マッチ「」1回以上、すなわち、しかし、のように数回+'と '+':。意味します。?。詳細は、['perlretut'](http://perldoc.perl.org/perlretut.html)を参照してください。 –

+1

YUp That works。ありがとうございます。 – ary

答えて

0

、あなたは正規表現で、.+?.+を置き換えるすなわち、最短一致数量を使用する必要があります。

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

perlretutによると:

時には貪欲です良くない。時には、量限定子を にしたい場合、最大の部分ではなく、最小限の文字列に一致させることができます。この の目的のために、Larry Wallは最小一致または非貪欲の 限定子を作成しましたか? 、*? 、+?、{}?これらは通常の量指定子ですか? ?それらに追加されます。

[...]

  • +:彼らは以下の意味がありますか?可能
+0

@aryこの回答が問題を解決した場合は、それを受け入れることを検討してください。 「誰かが私の質問に答えるとどうすればいいですか?」(http://stackoverflow.com/help/someone-answers)を参照してください。 –