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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top