我似乎找不到关于 haskell 的 POSIX 实现的像样的文档。具体来说是模块Text.Regex.Posix
。
谁能指出我在字符串上使用多行匹配的正确方向?
好奇的片段:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
我正在尝试提取维基百科页面的来源,但是当涉及多行时,这种方法显然会失败。
我似乎找不到关于 haskell 的 POSIX 实现的像样的文档。具体来说是模块Text.Regex.Posix
。
谁能指出我在字符串上使用多行匹配的正确方向?
好奇的片段:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
我正在尝试提取维基百科页面的来源,但是当涉及多行时,这种方法显然会失败。
您可能需要import Text.Regex.Base.RegexLike
访问makeRegexOpts
和朋友。
extractToken body = match regex body where
regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
好吧,因为Text.Regex.Posix
's defaultCompOpt = compExtended + compNewline
,这相当于
extractToken body = match regex body where
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
要仅提取第一组,请使用RegexLike
. 一种可能是
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*)*
尽管这可能并不总是有效,具体取决于您的表达方式。如果可以的话,上述解决方案可能是最好的方法。