parsing - Attoparsec:跳过(但不包括)多字符分隔符

标签 parsing haskell attoparsec

我有一个几乎可以包含任何字符的字符串。字符串内部有分隔符{{{

例如:afskjdfakjsdfkjas{{{fasdf

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

最佳答案

使用attoparseclookAhead(它应用解析器而不消耗任何输入)和manyTill来编写一个解析器,它消耗最多的所有内容(但不包括){{{ 分隔符。然后,您可以自由地应用该解析器并丢弃其结果。

{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative ( (<|>) )
import Data.Text ( Text )
import qualified Data.Text as T
import Data.Attoparsec.Text
import Data.Attoparsec.Combinator ( lookAhead, manyTill )

myParser :: Parser Text
myParser = T.concat <$> manyTill (nonOpBraceSpan <|> opBraceSpan)
                                 (lookAhead $ string "{{{")
                    <?> "{{{"
  where
    opBraceSpan    = takeWhile1 (== '{')
    nonOpBraceSpan = takeWhile1 (/= '{')

在 GHCi 中:

λ> :set -XOverloadedStrings 
λ> parseTest myParser "{foo{{bar{{{baz"
Done "{{{baz" "{foo{{bar"

关于parsing - Attoparsec:跳过(但不包括)多字符分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30446223/

相关文章:

haskell - 在 Haskell 中向其他线程抛出异常的操作语义

haskell - 在 Happstack 请求处理程序中捕获程序错误

haskell - 使用 Attoparsec 时输入不完整的问题

parsing - 快速解析允许转义字符的字符串?

c++ - spirit 解析器输出中的附加符号

java - 我使用解析正确吗?

parsing - 是否可以将不断变化的 JSON 键与较大记录类型中的 aeson 的总和类型数据构造函数相匹配?

ios - NSXMLParser parse() 只工作一次

haskell - 直觉类型理论的组合逻辑等价物是什么?