質問

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

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

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

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

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

役に立ちましたか?

解決

makeRegexOpts および友人にアクセスするには、 Text.Regex.Base.RegexLike をインポートする必要がある場合があります。

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

まあ、 Text.Regex.Posix defaultCompOpt = 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>"

他のヒント

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

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

この場合、一致させることで解決しました

((.*)|\n*)*

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top