次のようなサンプルデータの場合:
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ステップのアプローチを使用してください。後者の正規表現は、後継者にとってメンテナンスの悪夢になる可能性があります。