Parsec:解析满足某个谓词的字符串
Parsec: parse string that satisfies some predicate
Parsec 已经有一个 satisfy
解析器,它在给定谓词 returns True
应用于给定字符时成功:
punctuationOrSymbol = satisfy isPunctuation <|> satisfy isSymbol
我怎样才能对整个字符串做类似的事情?我需要它,因为我想解析一个 URI,但前提是它是有效的。为此,我想利用 isURI
function in network-uri
package。类似于:
uri :: ParsecT s u m URI
uri = parseURI <$> satisfyForString isURI
我怀疑和token
函数有关,但我是Haskell新手,一直没能看懂
ParsecT
是 Alternative
的一个实例,所以你可以使用 guard
做这样的事情:
predicateP :: (a -> Bool) -> Parsec s u a -> Parsec s u a
predicateP pr p = do
x <- p
guard $ pr x
return x
如果它已经在某个地方作为组合器存在,我不会感到惊讶,但我对 parsec
不是很熟悉。
现在只给了你一个应用谓词的方法;要将其应用于字符串,您必须首先获得您认为是或可能是 URL 的字符串。如何获得它取决于您的域(在解析 XML 时,您很可能会在属性或文本内容中找到它们)。
Parsec 已经有一个 satisfy
解析器,它在给定谓词 returns True
应用于给定字符时成功:
punctuationOrSymbol = satisfy isPunctuation <|> satisfy isSymbol
我怎样才能对整个字符串做类似的事情?我需要它,因为我想解析一个 URI,但前提是它是有效的。为此,我想利用 isURI
function in network-uri
package。类似于:
uri :: ParsecT s u m URI
uri = parseURI <$> satisfyForString isURI
我怀疑和token
函数有关,但我是Haskell新手,一直没能看懂
ParsecT
是 Alternative
的一个实例,所以你可以使用 guard
做这样的事情:
predicateP :: (a -> Bool) -> Parsec s u a -> Parsec s u a
predicateP pr p = do
x <- p
guard $ pr x
return x
如果它已经在某个地方作为组合器存在,我不会感到惊讶,但我对 parsec
不是很熟悉。
现在只给了你一个应用谓词的方法;要将其应用于字符串,您必须首先获得您认为是或可能是 URL 的字符串。如何获得它取决于您的域(在解析 XML 时,您很可能会在属性或文本内容中找到它们)。