Mehrzeilige Matching in Haskell Posix
-
06-07-2019 - |
Frage
Ich kann nicht scheinen anständige Dokumentation auf Haskells POSIX Umsetzung zu finden.
Insbesondere das Modul Text.Regex.Posix
.
Kann mich jemand in der richtigen Richtung auf einem String mehrzeiligen Matching zu verwenden?
Ein Ausschnitt für Neugierige:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
Ich versuche, die Quelle von Wikipedia-Seiten zu extrahieren, aber diese Methode deutlich umfällt, wenn mehr als eine Zeile beteiligt ist.
Lösung
Unter Umständen müssen Sie für den Zugriff auf import Text.Regex.Base.RegexLike
und Freunde makeRegexOpts
.
extractToken body = match regex body where
regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Nun, da Text.Regex.Posix
die defaultCompOpt = compExtended + compNewline
, die äquivalent als
extractToken body = match regex body where
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Um nur die erste Gruppe herausziehen, verwenden Sie eine der anderen Instanzen von RegexLike
. Eine Möglichkeit ist,
extractToken body = head groups where
(preMatch, inMatch, postMatch, groups) =
match regex body :: (String, String, String, [String])
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Andere Tipps
Sie müssen stattdessen die PCRE-Backend verwenden, wenn Sie etwas flexibler machen wollen, oder mit einer besseren Leistung als Posix Regexes.
pcre-light und regex-pcre sind beide in Ordnung.
ich in diesem Fall gelöst durch Anpassung
((.*)|\n*)*
Auch wenn dies nicht immer funktioniert möglicherweise auf Ihrem Ausdruck abhängig. Die obige Lösung ist wahrscheinlich der beste Weg zu gehen, wenn Sie in der Lage zu.