今日のラクダ - 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のクラシッククラスで良いかなと思う。理由はクラスの部分があまり長くなりすぎると周りの文脈のイメージがつかみにくくなるからだ。ただPerlのUnicode対応の豊富さを考えると標準Unicode属性を使った方法はある程度覚えておいた方が良さそう。
5.7.3 クロイスタ p.216
/(?i: foo)Bar/ # match fooBar, FooBar, ...
オプションをリテラルの最後じゃなく正規表現中に書く記法。外部から与えられた文字列からevalせずに正規表現を組み立てるなら(ユーザーが)覚えておくとよさそう。あとRubyの場合Regexpクラスのインスタンスを文字列化すると,このクロイスタ形式で表現された文字列になる。
5.9 パターンマッチを制御する p. 222
いつ逆スラッシュが制御されるのか
変数に入れた文字列から正規表現を組み立てる時はダブルクォートなどを使うと逆スラッシュなどが展開されてしまうのでシングルクォートを使うようにすればよい。
5.10.3 プログラムパターン
/e修飾子はRubyでいうところのString#gsubのブロックの場合と同じような挙動。/eeだとその結果をさらにevalする。
この辺りはもう少し具体例を見てみたい。
- マッチ時パターン展開: /??{ CODE }??/
- 条件付き展開: /(?(COND)IFTRUE|IFFALSE)/