Attoparsec:跳过(但不包括)多字符定界符

dan*_*iaz 5 parsing haskell attoparsec

我有一个字符串,几乎可以包含任何字符。在字符串中有定界符{{{

例如:afskjdfakjsdfkjas{{{fasdf

使用attoparsec,编写a的惯用方式是什么Parser (),它跳过之前的所有字符{{{,但又不消耗{{{

jub*_*0bs 3

使用attoparsec\'s lookAhead(应用解析器而不消耗任何输入)并manyTill编写一个解析器,该解析器消耗直到(但不包括){{{分隔符的所有内容。然后,您可以自由地应用该解析器并丢弃其结果。

\n\n
{-# 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 (/= \'{\')\n
Run 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"\n
Run Code Online (Sandbox Code Playgroud)\n