2017-05-09 7 views
-3

'EUR_AF'の値を抽出したいこのコードは、ここでは'0.39'です。 場合によっては'EUR_AF'で終わり、​​3210で終わる場合もあります。 'EUR_AF'は、'=0.39;'または'=0.39'の代わりに'=0'で終わることがあります。perlからgrepへの正規表現を、異なるエンディングの文字列に作用させます。

コードをどのように処理するのですか?それをオンラインで見つけることはできないようです...私はもちろん、ほとんど無限のif-elsif-elseステートメントですべてをラップすることができますが、それは過度のようです。

例のテキスト:

AVGPOST=0.9092;AN=2184;RSQ=0.5988;ERATE=0.0081;AC=144;VT=SNP;THETA=0.0045;AA=A;SNPSOURCE=LOWCOV;LDAF=0.0959;AF=0.07;ASN_AF=0.05;AMR_AF=0.10;AFR_AF=0.11;EUR_AF=0.039

コード:$INFO =~ m/\;EUR\_AF\=(.*?0)/EUR_AF=0の例を扱いますが、効率的に代替シナリオを処理する方法:$INFO =~ m/\;EUR\_AF\=(.*?)(;)/

私がいることを見つけましたか?

+1

あなたは 'を作ることができるが、 'オプションで'? 'を指定するか、'? 'で' 0'オプションを指定することができます。あるいは、 '='の後ろの数字をすべて引くこともできます。例えば'EUR_AF = [0-9] +(?:\。[0-9] +)? '。 – chris85

答えて

2

抽出するために、一つの値が正しいキャプチャグループの編集をしたい場合は

my %rec = split(/[=;]/, $s); 
my $eur_af = $rec{EUR_AF}; 
+0

あなたは 'my%rec = split/[=;]/$ s; ---つまり、制限なし。 –

+1

@SinanÜnür、実際には、私は 'map {split(/ =、$ _、2)} split /;/$ s'に行っていましたが、 – ikegami

+0

最良の解決策は '/(?:^ |;)EUR_AF =([^;] *)/'で、 '1.00'や' 0.039'の場合も適切に扱うからです。答えは「1.00」または「0.039」であり、「0」または「.039」ではありません。ありがとう! –

-3

私は答えを見つけました。コード:

$INFO =~ m/(?:^|;)EUR_AF=([^;]*)/

EUR_AF=0EUR_AF=0.39は、;なしかを終了する場合を扱うようです。結果として得られる$INFO0または0.39になります。

-1

この正規表現は、あなたのために働く必要があります。(?<=EUR_AF=)\d+(\.\d+)? それは

(?<=EUR_AF=)を意味 - EUR_AF=

\d+(\.\d+)?が付け加えた文字列を探して - 小数点以下の桁

EDIT、必要に応じて、数字で構成されています。Iもともとキャプチャグループだけでなく、正規表現全体が正しい結果を返すことを望んでいました。

my ($eur_af) = $s =~ /(?:^|;)EUR_AF=([^;]*)/; 

my ($eur_af) = ";$s" =~ /;EUR_AF=([^;]*)/; 

エキスすべての値:あなたは(?<=EUR_AF=)(\d+(?:\.\d+)?)

+1

簡単にする必要があります: 'EUR_AF = \ d +(\。\ d +)?'不要なルックバックは物事を遅くするだけです。 – ikegami

+2

'(...)?'は意味をなさない。私はあなたが '(?:...)を意味すると思います? '。キャプチャについて言えば、正しいキャプチャはありません。 ';?EUR_AF =(\ d +(?:\。\ d +)?)'は単純に見た目を削除するだけで、 )?) '。 '; EUR_AF =([^;] *)' – ikegami

+0

実際には 'EUR_AF = \ d +(\。\ d +)ですか? 'は' .039'で終わるか、 'EUR_AF = 1.00'の場合は' .00'で終わるので解決策ではありません。 –

関連する問題