2012年5月19日土曜日

Gaucheで正規表現を使う

LLなら正規表現でパターンマッチや置換ができるのは当たり前だと思ってたら、Schemeの言語仕様に正規表現は含まれていないそうな。ただ、Schemeの一実装であるGaucheでは正規表現を使える。網羅は本家リファレンスに任せて、とりあえず使いそうな部分を適当に抜き出し。

正規表現オブジェクトは
#/〜/
と正規表現リテラルで記述するか、
(string->regexp "〜")
と文字列からの変換することで作成できる。

パターンマッチは
(rxmatch 正規表現 文字列)
または
(正規表現 文字列)
でテストできる。マッチしたら<regmatch>オブジェクト、しなかったら#f。
<regmatch>オブジェクトから一致した部分文字列等を取り出すにはrxmatch-*系の関数が使えるが、正規表現オブジェクトと同様に、<regmatch>オブジェクトも関数のように使用可能。
Rubyでいうところの以下のような処理は
if /(\w+)=(\w+)/ ~= string
  name = $1
  value = $2
end
Gaucheでは以下のように書ける。
(let
  ((match (#/(\w+)=(\w+)/ string)))
  (if match (begin
    (set! name (match 1))
    (set! value (match 2)))))

置換は
(regexp-replace 正規表現 元の文字列 置換文字列)
(regexp-replace-all 正規表現 元の文字列 置換文字列)

でできる。regexp-replaceは最初にマッチした部分のみを置換。regexp-replace-allは全てのマッチした部分を置換。置換文字列の代わりに1引数のプロシージャを与えると、マッチした部分を単純に文字列で置換する代わりに、<regmatch>オブジェクトを引数としてそのプロシージャを呼び出した結果で置換する。

0 件のコメント:

コメントを投稿