dan*_*iaz 5 parsing haskell attoparsec
我有一个字符串,几乎可以包含任何字符。在字符串中有定界符{{{。
例如:afskjdfakjsdfkjas{{{fasdf。
使用attoparsec,编写a的惯用方式是什么Parser (),它跳过之前的所有字符{{{,但又不消耗{{{?
使用attoparsec\'s lookAhead(应用解析器而不消耗任何输入)并manyTill编写一个解析器,该解析器消耗直到(但不包括){{{分隔符的所有内容。然后,您可以自由地应用该解析器并丢弃其结果。
{-# LANGUAGE OverloadedStrings #-}\n\nimport Control.Applicative ( (<|>) )\nimport Data.Text ( Text )\nimport qualified Data.Text as T\nimport Data.Attoparsec.Text\nimport Data.Attoparsec.Combinator ( lookAhead, manyTill )\n\nmyParser :: Parser Text\nmyParser = T.concat <$> manyTill (nonOpBraceSpan <|> opBraceSpan)\n (lookAhead $ string "{{{")\n <?> "{{{"\n where\n opBraceSpan = takeWhile1 (== \'{\')\n nonOpBraceSpan = takeWhile1 (/= \'{\')\nRun Code Online (Sandbox Code Playgroud)\n\n在 GHCi 中:
\n\n\xce\xbb> :set -XOverloadedStrings \n\xce\xbb> parseTest myParser "{foo{{bar{{{baz"\nDone "{{{baz" "{foo{{bar"\nRun Code Online (Sandbox Code Playgroud)\n