1

別のトピックで、123 のような一致する数字について質問しました。これは狭すぎて、Regex を深く掘り下げると、本当に何かを定義する必要があることがわかりました。だから私は指数表記を求めて、この投稿で答えを得ました: /^keyword\s+(-?(?:\d+|\d*\.\d*)(?:[Ee]-?(?:\d+|\d*\.\d*))?)/. 私はこれを理解しようとしましたが、これまでのところ失敗しました。

だから今、もっと具体的に尋ねます。数字を一致させる必要があります。ここにいくつかの例を示します。

13
-999
83.12300
.151
-.213
1e14
124e2
-9e-4

あなたはそれを手に入れました、通常の数学のもの。

さらに具体的に言うと、このための私の Perl コードを示します。行を検索しkeywordていて、この行から値を取得する必要があります。or-ステートメントを使用した回避策||が問題を引き起こすように思われるため、1 つの正規表現でこの値を取得したいと考えています。

my $value;
open(FILE,"data.dat") or die "error on opening data: $!\n";
while (my $line = <FILE>) {
        if (($line =~ /^keyword\s+(-?(?:\d+|\d*\.\d*)(?:[Ee]-?(?:\d+|\d*\.\d*))?)/x) || ($line =~ /^keyword\s*(\d*\.\d*)/)) {
                $value = $1;
        };
}
close(FILE);

編集

これまでのところ、ヒントをくれたすべての人に感謝します。

4

4 に答える 4

0

あなたの有益な投稿と私が最近読んだもののおかげで、私は正規表現構造をより理解することができました. したがって、このかなり単純なタスクでは、追加のモジュール/パッケージを使用したくなく、正規表現に固執したいと考えています。冗長性を省き、自分のタスクに合わせて調整するために、いくつかのテストと変更を行いました。したがって、1 行に複数の数字が含まれることはなく、行に空白が含まれる場合があります。また、数字の末尾はセミコロンで定義されます。要約すると、最終的なコードを投稿します。助けてくれてありがとう。

#!/usr/bin/perl

use strict;
use warnings;

my @numbers=(
"keyword 152;",
"keyword 12.23;",
"keyword -2.001;",
"keyword .123;",
"keyword -12.;",
"keyword 55.44.33;",
"keyword 3e14;",
"keyword -3.000e0014;",
"keyword 5e-04;",
"   keyword     5e-04;  ",
"keyword 5e-04  ;",
"keyword .1e2;",
"keyword 9.e3;",
"keyword -0.01E-03;",
"keyword 1.3e-03;",
"keyword 1dd;",
"keyword -12E3e1;",
"keyword -.e.;",
"keyword -.e-.;");

for (@numbers) {

if (    /\s* keyword \s+        # stuff before matched number
    ( -?            # optional minus sign
      (?:           # no saving of group in brackets
        (?:\d+\.?\d*)       # match trailing digit and possible floating point number
        |           # or
        (?:\.\d+)       # no trailing digit and forced fpn
      )
    (?:[Ee]-?\d+)?      # optional exponential notation
    )           # end of group to be matched
    ;\s*            # stuff after matched number
    /x) {

print "<<__$_\__>>\n\t $1 \n";
} else { 
print "<<__$_\__>>\n\t !!!!! no matching here !!!!!\n";
}
}

出力:

<<__keyword 152;__>>
     152 
<<__keyword 12.23;__>>
     12.23 
<<__keyword -2.001;__>>
     -2.001 
<<__keyword .123;__>>
     .123 
<<__keyword -12.;__>>
     -12. 
<<__keyword 55.44.33;__>>
     !!!!! no matching here !!!!!
<<__keyword 3e14;__>>
     3e14 
<<__keyword -3.000e0014;__>>
     -3.000e0014 
<<__keyword 5e-04;__>>
     5e-04 
<<__    keyword     5e-04;  __>>
     5e-04 
<<__keyword 5e-04   ;__>>
     !!!!! no matching here !!!!!
<<__keyword .1e2;__>>
     .1e2 
<<__keyword 9.e3;__>>
     9.e3 
<<__keyword -0.01E-03;__>>
     -0.01E-03 
<<__keyword 1.3e-03;__>>
     1.3e-03 
<<__keyword 1dd;__>>
     !!!!! no matching here !!!!!
<<__keyword -12E3e1;__>>
     !!!!! no matching here !!!!!
<<__keyword -.e.;__>>
     !!!!! no matching here !!!!!
<<__keyword -.e-.;__>>
     !!!!! no matching here !!!!!

PS:?:コードの実行中にリソースが保存されない可能性があり、正規表現があまり見やすくない可能性があることを読んだことがあります。

于 2013-08-08T07:05:14.643 に答える