我正在尝试实现一些parse函数,它只接受这个字符串末尾的某个特定字符,如果使用正则表达式给出字符为.*!$
,则该字符为!
。
我尝试使用以下函数,但它不起作用,因为它会在匹配结束之前使用字符。
endWith :: Char -> Parser ()
endWith x = many anyChar >> char x >> return ()
需要注意的一点是:"ab!cd!"
的预期输出为("ab!cd!", "")
,此解析器根本不应使用"ab!cd"
,因为它不会以{{1}结尾}。使用!
是否可以使用Parsec?我想一些高级组合是需要的。
答案 0 :(得分:3)
manyTill
这样做。
endWith :: Char -> Parser String
endWith x = anyChar `manyTill` char x
答案 1 :(得分:3)
这是一个成功解析"ab!"
和"ab!cd!"
但拒绝"ab"
和"ab!cd"
的人:
import Text.Parsec
import Text.Parsec.String
endWith :: Char -> Parser String
endWith c = manyTill anyChar (try $ char c <* eof)
(请注意,返回的结果不包括尾随c
):
"ab!" Succeeds with "ab"
"ab!cd!" Succeeds with "ab!cd"
"ab" Fails
"ab!cd" Fails
答案 2 :(得分:0)
这是你在找什么?
import Text.Parsec
import Text.Parsec.String
endWith :: Char -> Parser String
endWith x = do cs <- many anyChar -- consume rest of input
case cs of
[] -> fail "expecting !"
_ -> if last cs == '!' then return cs
else fail "did not end in !"
test1 = parseTest (endWith '!') "This is a test!"
test2 = parseTest (endWith '!') "ab!cd!"
test3 = parseTest (endWith '!') "ab!cd"