4

Haskell の POSIX 実装に関するまともなドキュメントが見つからないようです。具体的にはモジュールText.Regex.Posix

誰かが文字列で複数行の一致を使用する正しい方向に私を向けることができますか?

好奇心旺盛な人のためのスニペット:

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

ウィキペディアのページのソースを抽出しようとしていますが、複数の行が関係している場合、この方法は明らかに失敗します。

4

3 に答える 3

7

や友達import Text.Regex.Base.RegexLikeにアクセスするために必要な場合があります。makeRegexOpts

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

は であるため、次Text.Regex.PosixdefaultCompOpt = compExtended + compNewlineように同等に機能します。

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

最初のグループだけを取り出すには、 の他のインスタンスのいずれかを使用しますRegexLike。1つの可能性は

extractToken body = head groups where
    (preMatch, inMatch, postMatch, groups) =
        match regex body :: (String, String, String, [String])
    regex = makeRegexOpts compExtended defaultExecOpt
              "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
于 2009-06-22T20:17:12.693 に答える
2

Posix 正規表現よりも柔軟に、またはパフォーマンスを向上させたい場合は、代わりに PCRE バックエンドを使用する必要があるかもしれません。

pcre-light と regex-pcre はどちらも問題ありません。

于 2009-06-22T18:46:50.293 に答える
0

この場合、マッチングで解決しました

((.*)|\n*)*

ただし、これは表現によっては常に機能するとは限りません。可能であれば、上記の解決策がおそらく最善の方法です。

于 2009-06-22T19:51:55.943 に答える