我正在尝试使用Parsec解析mediawiki文本。 MediaWiki标记中的某些构造只能出现在行的开头(例如标头标记==header level 2==
)。在regexp中,我将使用锚点(例如^
)来查找行的开头。
GHCi的一种尝试是
Prelude Text.Parsec> parse (char '\n' *> string "==" *> many1 letter <* string "==") "" "\n==hej=="
Right "hej"
但这不太好,因为它将在文件的第一行失败。我觉得这应该是一个已解决的问题...
在Parsec中最惯用的“行首”解析是什么?
最佳答案
您可以使用getPosition
和sourceColumn
来找出解析器当前正在查看的列号。如果当前位置在行的开头(例如在输入的开头或在1
或\n
字符之后),则列号将为\r
。
没有内置的组合器,但是您可以轻松实现:
import Text.Parsec
import Control.Monad (guard)
startOfLine :: Monad m => ParsecT s u m ()
startOfLine = do
pos <- getPosition
guard (sourceColumn pos == 1)
现在,您可以将标头解析器编写为:
header = startOfLine *> string "==" *> many1 letter <* string "=="
关于haskell - Parsec行开始模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46225920/