"(abc)"の"abc"を取り出します。
import Text.Parsec import Text.Parsec.String parens :: Parser a -> Parser a parens = between (char '(') (char ')') parseText :: Parser String parseText = parens $ many $ noneOf ")" run :: Show a => Parser a -> String -> IO () run p input = case (parse p "" input) of Left err -> do{ putStr "parse error at " ; print err } Right x -> print x main = do run parseText "(abc)"
abc
カッコ内の文字列部分をパースを終了するために「')'までをカッコ内の文字列とする」という処理をどう書くか調べていたら、noneOf関数を使用すればいいようです。C++のBoost.Spirit.Qiでいうところのoperator-()です。
Parsecには開き処理と閉じ処理のための関数betweenが用意されてるので、それを使って丸カッコをパースする関数parensを用意しています。
それとパーサーの型は「data ParsecT s u m a」となっていてよくわからなかったので、
Text.Parsec.String内で付けられている別名「Parser a」を使用しています。