Emparejamiento multilínea en Haskell Posix
-
06-07-2019 - |
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.
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.