Correspondance multiligne dans Haskell Posix
-
06-07-2019 - |
Question
Je n'arrive pas à trouver une documentation décente sur l'implémentation POSIX de haskell.
Plus précisément, le module Text.Regex.Posix
.
Quelqu'un peut-il m'indiquer la bonne direction pour utiliser la correspondance multiligne sur une chaîne?
Un extrait pour les curieux:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
J'essaie d'extraire la source des pages wikipedia, mais cette méthode échoue clairement lorsque plusieurs lignes sont impliquées.
La solution
Vous devrez peut-être importer Text.Regex.Base.RegexLike
pour accéder à makeRegexOpts
et à vos amis.
extractToken body = match regex body where
regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Eh bien, puisque Text.Regex.Posix
du defaultCompOpt = compExtended + compNewline
, cela fonctionne de manière équivalente à
extractToken body = match regex body where
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Pour extraire uniquement le premier groupe, utilisez l'une des autres instances de RegexLike
. Une possibilité est
extractToken body = head groups where
(preMatch, inMatch, postMatch, groups) =
match regex body :: (String, String, String, [String])
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Autres conseils
Vous devrez peut-être utiliser le backend PCRE à la place si vous souhaitez faire quelque chose de plus souple ou de meilleur rendement que les expressions rationnelles Posix.
pcre-light et regex-pcre vont bien.
J'ai résolu dans ce cas en faisant correspondre
((.*)|\n*)*
Bien que cela puisse ne pas toujours fonctionner en fonction de votre expression. La solution ci-dessus est probablement la meilleure voie à suivre si vous le pouvez.