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.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>"
于 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 回答