正規表現

emacsからsdicを使って英辞郎を参照できるようにしているのだけれど、いちいちルビが: 漢字{かんじ}のように表示されるのがうざったいのでルビを取り除くフィルタを書いてみた。
正規表現Gaucheの標準ライブラリで用意されていて、マッチがオブジェクトとして実装されているのが面白い。

#!/usr/local/bin/gosh

;;;英辞郎のSDIC形式からルビを取り除く
(define (delete-rubi line)
  (while (rxmatch #/{.*?}/ line)
    (set! line (regexp-replace #/{.*?}/ line "")))
  line)

(define (main args)
  (let loop *1
          (loop (read-line (current-input-port)))))))

ここで正規表現を単に #/{.*}/ と書くと最長一致する。つまり"ほにゃらら{hoge}ほげほげ{mage}"という文字列に対し#/{.*}/でマッチを取ると"{hoge}ほげほげ{mage}"が対応してしまう。最短一致の為にここでは#/{.*?}/を使用している。これで"{hoge}"がマッチするようになる。
最近やっとnamed-letを理解して使うようになってきた。letrecではやはりネストが深くなりすぎる。

英辞郎は50MB以上あるのでこのスクリプトで2時間以上かかる…

*1:line (read-line (current-input-port)))) (if (eof-object? line) 0 (begin (format (current-output-port) "~A~%" (delete-rubi line