4

いくつかのファイルからデータを引き出すperlスクリプトを継承しました。スクリプト全体は正常に機能しますが、最近、一部のエンジニアは、通常1つの番号を使用する特定のスポットに複数の番号を入力しているため、出力に期待されるものがすべて表示されていません。

サンプル入力:

CRXXXX: "Then some text"

CRs XXXX, XXXX, XX, XXX

CRXXX "Some Text"

現在、私が持っているこの正規表現ステートメントは、CRの後に番号を引き出しますが、指定された場合、サンプル入力の2行目が、必要なもの"s XXXX, XXXX, XX, XXX"の代わりに出力されます。"XXXX XXXX XX XXX"

私はperlに非常に慣れておらず、すべての入力で機能するようにこの正規表現を変更する方法を理解するのに苦労しています。

 $temp_comment =~ s/\s[cC][rR][-\s:;]*([\d])/\n$1/mg;

前もって感謝します!

ブロック

4

4 に答える 4

2

次のようなサンプルデータの場合:

my $temp_comment =
'CR1234: "Then some text"
 CRs 2345, 3456, 45, 567
 CR678 "Some Text"';

試す:

$temp_comment =~ s/(,)|[^\d\n]+/$1?' ':''/semg;

または、文字列テンプレートの近くにとどまりたい場合:

$temp_comment =~ s/ ^                 # multi-line mode, line start
                    \s*               # leading blanks?
                    CR                # CR tag
                    \D*               # non-number stuff
                     (                  # start capture group
                      (?:\d+ [,\s]*)+   # find (number, comma, space) groups
                     )                  # end capture group
                    \D*               # skip remaining non-number stuff
                    $                 # multi-line mode, line end
                  /$1/mxg;            # set multi-line mode + regex comments "x" 

ただし、後続の手順で番号グループのコンマを削除する必要があります。

$temp_comment =~ tr/,//d;             # remove commas in the whole string

また

$temp_comment =~ s/(?<=\d),(?=\s\d)//g;  # remove commas between numbers '11, 22'

「シングルステップ」の場合、/e修飾子を使用する必要があります。

$temp_comment =~ s{ ^                 # line start
                    \s*               # leading blanks?
                    CR                # CR tag
                    \D*               # non-number stuff
                    ((?:\d+ [,\s]*)+) # single or group of numbers
                    \D*               # non number stuff
                    $                 # line end
                  }
                  {do{(local$_=$1)=~y/,//d;$_}}mxeg;

これにより、上記のデータでは、次のようになります。

1234
2345 3456 45 567
678 

しかし、実際には、可能であれば、 より単純な2ステップのアプローチを使用してください。後者の正規表現は、後継者にとってメンテナンスの悪夢になる可能性があります。

于 2012-07-23T19:31:46.513 に答える
1

これは2つのステップで行う方がよい場合があります。

1)正規表現を作成します

s/\s[cC][rR][-\s:;]*([\d\ ]+)/\n$1/mg(すべての番号をキャプチャする新しい方法に注意してください。上記の最初の番号のみをキャプチャしています)

2)次に、検索/置換を使用して、文字列内のコンマを削除します。

于 2012-07-23T19:10:29.323 に答える
1
my ($v) = /CR[s ]*((?:\d+[\s,]*)*)/ig;
$v =~ s/,//g;
print $v,"\n";
于 2012-07-23T19:19:04.973 に答える
1

おそらく、次のことがあなたのために働くでしょう:

use Modern::Perl;

say join ' ', (/(\d+)/g) for <DATA>;

__DATA__
CR1234: "Then some text"
CRs 1111, 2222, 33, 444
CR567 "Some Text"

出力:

1234
1111 2222 33 444
567

お役に立てれば!

于 2012-07-23T19:41:09.883 に答える