Haskell Posixでの複数行マッチング
-
06-07-2019 - |
質問
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*)*
これは、表現によっては常に機能するとは限りませんが。 可能であれば、上記の解決策がおそらく最善の方法です。
所属していません StackOverflow