Lambdaカクテル

ソフトウェア開発者です.玉石混淆です.

Schemeの正規表現では^$は行頭行末には対応しない

Gauche正規表現の罠
ここ数日、正規表現を使ったプログラムで遊んでいるが、思わぬ所でハマったのでメモ。
行頭がアスタリスクの行にヒットするべく、/^\*(.+)$/なんてコードを書いたら、これがまるで動かない。何度試してもダメだった。
仕方ないのでGoogle先生に質問してみたところ、こんなページを発見した。

ほう。文全体にしか適用されないのか。
でもこれじゃあ行頭行末の処理がすんごく面倒になるんじゃないか?
行頭を指示するには「改行直後である」もしくは「文章の先頭である」事が必要なので、/[\n\A]/でマッチするのかしら?
また、リンク先にもあるように、行の分離はプログラム側から行なうべきなのか?
大前提として、殆んどの処理は行単位で行なわれるから、最初から行処理でもいいんだよね。
でも若干その前提にそぐわない例がある。

表記的に困る例
  1. ある特殊記号から始まる複数行をグループとして囲む処理。
  2. コメントなどのブロック処理。複文。

このような文を処理しようとした場合、行単位の処理ではおいつかない。
しかし行の分離を行えば、行を跨ぐパターンマッチが不可能になる。
この場合、「行単位の処理」→「文全体の処理」の順で処理を二分しなければならなくなるので結構に面倒だなあ。しかしながらこれが確実かつ明白な方法。
僕のプログラムは、ソースファイルから正規表現置き換えを実行した文章を吐き出す、いわばパーサなんだけれども、処理が煩雑になるのはできるだけ避けたいところだ。
それともいっそ、AWKで二次処理をさせるのも悪くないかもしれない*1
行だけで済む処理だけ、Gauche正規表現の力を借りることにしよう。

*1:Awkwardな手法だ