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.

War es hilfreich?

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

ausarbeitet
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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top