人気ブログランキング | 話題のタグを見る

Parsec を正規表現がわりに使う

grep などで使う正規表現は、文字列の中から文字のパターンを検索、置換するときに活用されている。

Parsec は、基本的にはそのような使い方を想定してはいないが、工夫すれば正規表現と同じ感覚で文字パターンを文字列から検索するのに使うことができる。このプログで紹介した Match.hs にそのための関数を定義してみた。ghci からこのファイルを import すれば、次の例のように正規表現を利用するのと同じ手軽さで Parsec を使うことができる。

前準備
C:\Users\******\Documnets>ghci
Prelude> :l Match.hs
[1 of 1] Compiling Match ( Match.hs, interpreted )
Ok, modules loaded: Match.
*Match>

行の先頭に "apple" の文字列のある行を選び出す。
*Match> filter (match (string "apple")) ["apple juice", "bad apple"]
["apple juice"]

行中に "apple" の文字列のある行を選び出す。
*Match> filter (match (search (string "apple"))) ["apple juice", "bad apple"]
["apple juice","bad apple"]

'l' とその後に任意の3文字が続くパターンを検索する。
*Match> getMatch (search (do m <- string "l"; n <- count 3 anyChar; return (m++n))) "apple juice, bad apple"
Just "le j"

行中の "apple" を "orange" に置換する。
*Match> map (replaceMatch (string "apple") "orange") ["apple juice", "bad apple"]
["orange juice","bad orange"]

正規表現よりかなり冗長になるが、Parsec のパターン記述機能を Haskell のプログラムの中で自由に利用することができるようになる。

また、Parsec のこのような利用の仕方をしているうちに、Parsec のパターン記述の方法に慣れてきて、プログラム言語のパーサの作成にも挑戦できるようになる。
by tnomura9 | 2011-12-01 00:23 | Haskell | Comments(0)
<< Parsec マッチした全ての... みうめ >>