我正在尝试使用Parsec解析mediawiki文本。 mediawiki标记中的一些构造只能出现在行的开头(例如标题标记==header level 2==
)。在regexp中,我会使用一个锚点(例如^
)来查找一行的开头。
GHCi的一次尝试是
Prelude Text.Parsec> parse (char '\n' *> string "==" *> many1 letter <* string "==") "" "\n==hej=="
Right "hej"
但这不太好,因为它会在文件的第一行失败。我觉得这应该是一个解决的问题...
什么是最惯用的&#34;行的开头&#34;在Parsec解析?
答案 0 :(得分:2)
您可以使用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 "=="
答案 1 :(得分:1)
您可以使用many (char '\n')
代替char '\n'
。在解析器组合器中,没有行开始的意义,因为它们总是在输入开始时运行。您唯一能做的就是手动检查输入可以从哪个符号开始。使用many (char '\n')
可确保标题== my header ==
之前只有零个或多个空行。