今日のラクダ - 5章 正規表現

難しいところもかなりあって詳しい説明はラクダ本よりも「詳説 正規表現」を読んだ方が良さそうなのでざっくりと読む。

5.2 パターンマッチ演算子 p 169.

開きデリミタの前には空白文字を置いても良い。

s (egg) <larva>

一瞬いいかなと思ったけど,こちらの方が両方の引数をくくるのでタイプ数が多い。それからやはりどうしてもメソッドっぽく見えてしまう。

5.2.2 m//演算子 P.175

デリミタに?をつかって?PETTERN?のように書くと,(中略)、reset演算子を呼び出してから次に再びそれを呼び出すまでの間に,一回だけしかマッチしない。

??演算子は,通常のパターンマッチが,最初ではなく最後に現れたものを見つけるような場合に,最も有効である。

なるほど。使いどころはそれほど多そうではないけど,一応頭に入れておく。

5.2.4 tr//演算子 p.180

sedの熱狂的支持者のために,tr///の同義語としてy///と書けるようになっている。

そもそもtrを使う機会そのものが少ない気もするけど(正規表現でやってしまうので)、yの方が短い割には普及してないような気もする。

tr演算子の修飾子(/c, /d, /s)、/sはRubyのString#squeezeと同義。

クラス指定のやり方は種類が多すぎて覚えきれない。ただ,基本的にはPerlのクラシッククラスで良いかなと思う。理由はクラスの部分があまり長くなりすぎると周りの文脈のイメージがつかみにくくなるからだ。ただPerlUnicode対応の豊富さを考えると標準Unicode属性を使った方法はある程度覚えておいた方が良さそう。

5.7.3 クロイスタ p.216

/(?i: foo)Bar/ # match fooBar, FooBar, ...

オプションをリテラルの最後じゃなく正規表現中に書く記法。外部から与えられた文字列からevalせずに正規表現を組み立てるなら(ユーザーが)覚えておくとよさそう。あとRubyの場合Regexpクラスのインスタンスを文字列化すると,このクロイスタ形式で表現された文字列になる。

5.9 パターンマッチを制御する p. 222

いつ逆スラッシュが制御されるのか

変数に入れた文字列から正規表現を組み立てる時はダブルクォートなどを使うと逆スラッシュなどが展開されてしまうのでシングルクォートを使うようにすればよい。

5.9.3 正規表現コンパイラ p. 226

use re "debug"とすると,正規表現がどのように処理されたかを表示することができる。

これはややこしい正規表現デバッグするときにはかなり役立ちそう。要チェック。

5.10.2 非バックトラックサブパターン p. 237

/(?>PATTERN)/

正規表現に非常に長い時間がかかるときは試してみる価値があるかも。

5.10.3 プログラムパターン

/e修飾子はRubyでいうところのString#gsubのブロックの場合と同じような挙動。/eeだとその結果をさらにevalする。

この辺りはもう少し具体例を見てみたい。

  • マッチ時パターン展開: /??{ CODE }??/
  • 条件付き展開: /(?(COND)IFTRUE|IFFALSE)/

5.10.4 自分でアサーションを定義する p. 249

qrをオーバーロードすれば良い。

結構使い道はありそうだけど,どのくらい使われているものだろうか。

やっぱり正規表現は難しい。あと古いところでのバッドノウハウが多いのでどこまで覚えてよいかが難しい。Perl Best Practiceの正規表現の章も合わせて参照した方が良さそう。