Haskell Posix中的多线匹配
-
06-07-2019 - |
题
我似乎无法在haskell的POSIX实现上找到合适的文档。
特别是模块 Text.Regex.Posix
。
有人能指出我在字符串上使用多行匹配的正确方向吗?
好奇的片段:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
我正在尝试提取维基百科页面的来源,但是当涉及多行时,这种方法显然会失败。
解决方案
您可能需要导入Text.Regex.Base.RegexLike
才能访问 makeRegexOpts
和朋友。
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
。一种可能性是
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