Matching várias linhas em Haskell Posix
-
06-07-2019 - |
Pergunta
Eu não consigo encontrar documentação decente sobre a implementação POSIX de Haskell.
Especificamente o módulo Text.Regex.Posix
.
Alguém pode me apontar na direção certa de usar combinando várias linhas em uma corda?
Um trecho para os curiosos:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
Eu estou tentando extrair a fonte de páginas da Wikipedia, no entanto, este método é claramente sobre quando mais de uma linha está envolvido.
Solução
Você pode precisar import Text.Regex.Base.RegexLike
de acesso a makeRegexOpts
e amigos.
extractToken body = match regex body where
regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Bem, já que Text.Regex.Posix
de defaultCompOpt = compExtended + compNewline
, que funciona de forma equivalente como
extractToken body = match regex body where
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Para retirar apenas o primeiro grupo, use uma das outras instâncias de RegexLike
. Uma possibilidade é
extractToken body = head groups where
(preMatch, inMatch, postMatch, groups) =
match regex body :: (String, String, String, [String])
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Outras dicas
Você pode precisar usar o backend PCRE vez se você quiser fazer algo mais flexível, ou com melhor desempenho, de expressões regulares POSIX.
pcre-luz e regex-pcre são ambos muito bem.
Eu resolvi, neste caso, combinando
((.*)|\n*)*
Embora este pode não funcionar sempre, dependendo da sua expressão. A solução acima é provavelmente o melhor caminho a percorrer se você é capaz.