3

以下の文字列から日付、月、年を抽出しようとしています。

my $test_str = "Jan 01, 2004    Feb 01, 2004    Mar 01, 2004    Apr 01, 2004    May 01, 2004";
foreach $s (split('\t', $test_str)) {
   my ($m, $d, $y) = split('[\s|,\s]');
   print ("$m=$d=$y\n");
}

出力を印刷すると、 $y は常に空です。私は何か間違ったことをしていますか?私が持っている正規表現は

[\s|,\s] # match a space or space and a comma
4

5 に答える 5

4

正規split表現は文字クラス(角かっこで[\s|,\s]示されます)です。これは、「空白、パイプ、コンマ、または空白(再び)のいずれかである単一の文字に分割する」ことを意味します。文字列を4つの文字列に分割します。[]|Jan 01, 2004

"Jan"
"01"
""        # comma + whitespace creates empty string
"2004"

変数も分割し$_ますが、これはタイプミスだと思います。

問題を解決するには、その行を次のように変更します。

my ($m, $d, $y) = split(/[\s,]+/, $s);

ご覧のとおり、+数量詞を使用すると、複数の連続するコンマまたは空白が削除されます。

于 2012-12-17T15:31:17.020 に答える
2

次のようにすることもできますsplit /,?\s/, $s;

于 2012-12-17T15:58:00.120 に答える
1

$sstrictと警告を使用すると、コンパイルエラーが発生することがわかります。

それで

my ($m, $d, $y) = split('\s|,\s', $s );

[]角かっこを取り除いたところ、問題なく動作しました。

于 2012-12-17T15:31:07.317 に答える
0

試す:

my $test_str = "Jan 01, 2004    Feb 01, 2004    Mar 01, 2004    Apr 01, 2004    May 01, 2004";
foreach my $s (split(/\t/, $test_str)) {
   my ($m, $d, $y) = split(/\s|,\s/,$s);
   print ("$m=$d=$y\n");
}

これにより、必要な出力が得られます。

Jan=01=2004
Feb=01=2004
Mar=01=2004
Apr=01=2004
May=01=2004

答えた他の人々が述べたように、、、、またはのいずれか[\s|,\s]に正確に一致する文字クラスです(これは明らかにあなたが望むものではありません)。\s|,

于 2012-12-17T15:31:23.580 に答える
0

この場合、を使用するよりもsplit、ターゲット文字列内のすべての英数字の部分文字列を検索する方が簡単です。パターンは\w英数字とアンダースコア文字に一致し、この目的には十分に正確です。

use strict;
use warnings;

my $test_str = "Jan 01, 2004\tFeb 01, 2004\tMar 01, 2004\tApr 01, 2004\tMay 01, 2004";

foreach (split /\t/, $test_str) {
   my ($m, $d, $y) = /\w+/g;
   print "$m=$d=$y\n";
}

出力

Jan=01=2004
Feb=01=2004
Mar=01=2004
Apr=01=2004
May=01=2004
于 2012-12-17T21:47:55.513 に答える