あなたの有益な投稿と私が最近読んだもののおかげで、私は正規表現構造をより理解することができました. したがって、このかなり単純なタスクでは、追加のモジュール/パッケージを使用したくなく、正規表現に固執したいと考えています。冗長性を省き、自分のタスクに合わせて調整するために、いくつかのテストと変更を行いました。したがって、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:?:
コードの実行中にリソースが保存されない可能性があり、正規表現があまり見やすくない可能性があることを読んだことがあります。