4 Stimmen

Mehrzeiliges Matching in Haskell Posix

Ich scheine keine anständige Dokumentation zur POSIX-Implementierung von Haskell zu finden. Konkret das Modul Text.Regex.Posix.

Kann mir jemand den richtigen Weg zeigen, wie man in einem String Mehrfachübereinstimmungen verwendet?

Ein Schnipsel für die Neugierigen:

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

Ich versuche den Quelltext von Wikipedia-Seiten zu extrahieren, jedoch scheitert diese Methode eindeutig, wenn mehr als eine Zeile beteiligt ist.

7voto

ephemient Punkte 189038

Sie müssen möglicherweise import Text.Regex.Base.RegexLike für den Zugriff auf makeRegexOpts und verwandte Funktionen benötigen.

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

Nun, da Text.Regex.Posix's defaultCompOpt = compExtended + compNewline ist, ergibt sich ein äquivalenter Ausdruck:

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

Um nur die erste Gruppe herauszuziehen, 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
              "]*id=\"wpTextbox1\"[^>]*>(.*)"

2voto

Don Stewart Punkte 136046

Sie müssen möglicherweise das PCRE-Backend verwenden, wenn Sie etwas flexibleres oder leistungsstärkeres als Posix-Regexes verwenden möchten.

Pcre-light und Regex-Pcre sind beide in Ordnung.

0voto

Ian Elliott Punkte 7338

In diesem Fall habe ich das Problem gelöst, indem ich übereinstimmte

((.*)|\n*)*

Obwohl dies je nach Ihrem Ausdruck möglicherweise nicht immer funktioniert. Die obige Lösung ist wahrscheinlich der beste Weg, wenn Sie dazu in der Lage sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X