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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top