Perl正規表現の罠と罠はずし
改行文字を含む文字列をマッチング対象とし、改行文字もただの文字として扱う場合、オプションにsを付けるが、行頭アンカー(^)を付けた文字列をマッチングパターンにすると、うまくマッチングしない不具合が起こる。
そこで、行頭アンカーを"(?:(?:^)|(?<=[\n]))"に置き換えるとうまく行く。意味は、「文字列の先頭、または前の文字が改行文字の場合」となる。
my $text = "12345\nABCDEFG\n12345\n"; print $text; # 変換前 $text =~ s/^ABCDE/x/gs; # この変換は失敗 print '-' x 20 . "\n"; print $text; # 変換後(変わらない) $text =~ s/(?:(?:^)|(?<=[\n]))ABCDE/abcde/gs; # この変換は成功 print '-' x 20 . "\n"; print $text; # 変換後(キチンと置き換わった)
12345 ABCDEFG 12345
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-