Abbinamento multilinea in Haskell Posix
-
06-07-2019 - |
Domanda
Non riesco a trovare una documentazione decente sull'implementazione POSIX di haskell.
In particolare il modulo Text.Regex.Posix
.
Qualcuno può indicarmi la giusta direzione dell'uso della corrispondenza multilinea su una stringa?
Uno snippet per i curiosi:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
Sto cercando di estrarre la fonte delle pagine di Wikipedia, tuttavia questo metodo cade chiaramente quando è coinvolta più di una riga.
Soluzione
Potrebbe essere necessario importare Text.Regex.Base.RegexLike
per accedere a makeRegexOpts
e agli amici.
extractToken body = match regex body where
regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Bene, dal defaultCompOpt = compExtended + compNewline
di Text.Regex.Posix
, che funziona in modo equivalente come
extractToken body = match regex body where
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Per estrarre solo il primo gruppo, utilizzare una delle altre istanze di RegexLike
. Una possibilità è
extractToken body = head groups where
(preMatch, inMatch, postMatch, groups) =
match regex body :: (String, String, String, [String])
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Altri suggerimenti
Potrebbe essere necessario utilizzare invece il backend PCRE se si desidera fare qualcosa di più flessibile o con prestazioni migliori rispetto alle regex di Posix.
pcre-light e regex-pcre vanno entrambi bene.
Ho risolto in questo caso abbinando
((.*)|\n*)*
Anche se questo potrebbe non funzionare sempre a seconda della tua espressione. La soluzione di cui sopra è probabilmente il modo migliore per andare se ne hai la possibilità.