Pregunta

Parece que no puedo encontrar documentación decente sobre la implementación POSIX de Haskell. Específicamente el módulo Text.Regex.Posix .

¿Alguien puede señalarme en la dirección correcta para usar la coincidencia de varias líneas en una cadena?

Un fragmento para los curiosos:

> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String

Estoy tratando de extraer la fuente de las páginas de wikipedia, sin embargo, este método claramente se cae cuando hay más de una línea involucrada.

¿Fue útil?

Solución

Es posible que deba importar Text.Regex.Base.RegexLike para acceder a makeRegexOpts y amigos.

extractToken body = match regex body where
    regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt
              "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"

Bueno, ya que Text.Regex.Posix es defaultCompOpt = compExtended + compNewline , eso funciona de manera equivalente como

extractToken body = match regex body where
    regex = makeRegexOpts compExtended defaultExecOpt
              "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"

Para extraer solo el primer grupo, use una de las otras instancias de RegexLike . Una posibilidad es

extractToken body = head groups where
    (preMatch, inMatch, postMatch, groups) =
        match regex body :: (String, String, String, [String])
    regex = makeRegexOpts compExtended defaultExecOpt
              "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"

Otros consejos

Es posible que deba utilizar el backend PCRE en su lugar si desea hacer algo más flexible o con mejor rendimiento que las expresiones regulares de Posix.

pcre-light y regex-pcre están bien.

Resolví en este caso haciendo coincidir

((.*)|\n*)*

Aunque esto puede no funcionar siempre dependiendo de su expresión. La solución anterior es probablemente la mejor manera de hacerlo si puede.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top