正規表現で先読み

Perl正規表現には先読み・後読みという機能がある。Rubyにもあるのだけど、OCamlのStrモジュールにはないみたい(PCREにはありそうだけど)。

最近、正規表現力が落ちまくっているので、ちょっと練習。

数値を三桁ずつカンマ区切りにしてみる。

$ pl 'my $s = "1234567890"; $s =~ s/(\d)(?=(\d{3})+(?!\d))/$1,/g; p $s'
$VAR1 = '1,234,567,890';

明日の自分へのメモがてら(すぐ忘れてそうなので…)書いておくと、

  • 肯定の先読み "(?=)" で数値三桁の組 "(\d{3})+" を探す。
  • でも、それだけだと数値三桁の組の右側に任意桁の数値が存在している場合もマッチしてしまう。
  • なので、さらに否定の先読み "(?!\d)" で右側に数値がこないパターンに限定する。
  • 上記にマッチしたらカンマを埋め込む、を続ける。

で、出来上がり。