マスタリング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__