マスタリングPerl (2章 高度な正規表現)

勉強メモ。

  • 特殊配列 "@-"と"@+"

正規表現によってマッチした先頭と末尾の文字列オフセットを、それぞれ配列"@-"と"@+"に保持する。
"@-[0]"と"@+[0]"は"$&"の開始位置と終了位置、"@-[1]"と"@+[1]"は"$1"の開始位置と終了位置を保持する。

#!/usr/bin/perl
### $&と同じ値を、@-と@+を使って取得する ###
use strict;
use warnings;

while (<DATA>) {
    if (m/perl/g){
	my $text = substr($_, $-[0], $+[0] - $-[0]);
	print "$&\n";
	print "$text\n";
    }
}

__DATA__
I love perl, I love ruby too.
  • (?options:PATTERN)

パターンの前に"?optins:"を付与することで、オプションを有効にできる。
"?-options"で無効にできる。デフォルトはオプション無効。
指定できるオプションは、以下の通り。

    • (?i) -> ケースインセンティブ(大文字/小文字区別しない)
    • (?m) -> 複数行マッチモード
    • (?s) -> ドット全マッチモード
    • (?x) -> フリーフォーマットモード
  • (?:PATTERN)

(?:PATTERN)とすると、パターンをキャプチャしないでグループ化できる。
無駄なメモリを消費しない。

  • /x

/xフラグを付与すると、正規表現内空白文字とPerlスタイルコメントを無視するようになる。
正規表現が読みやすくなるかも。
空白文字にマッチさせるには、明示的に\sとかを指定する。

  • 先読みアサーションと後読みアサーション(肯定と否定)
    • (?=PATTERN) -> (肯定の先読み):PATTERNが右側にマッチする時に成功
    • (?!PATTERN) -> (否定の先読み):PATTERNが右側にマッチしない時に成功
    • (?<=PATTERN) -> (肯定の後読み):PATTERNが左側にマッチする時に成功
    • (? (否定の後読み):PATTERNが左側にマッチしない時に成功

先読みと後読みは、マッチしたテキスト自体ではなく、マッチするテキストの位置を見つける。

#!/usr/bin/perl
### 数値にカンマを入れる ###
use strict;
use warnings;

my $val = 123456789;
my $val =~ s/($<=\d)(?=(\d\d\d)+$)/,/g:
print "$val\n";

__END__