【问题标题】:Multiline Matching in Haskell PosixHaskell Posix 中的多行匹配
【发布时间】:2009-06-22 18:38:28
【问题描述】:

我似乎找不到关于 haskell 的 POSIX 实现的像样的文档。 特别是模块Text.Regex.Posix

谁能指出我在字符串上使用多行匹配的正确方向?

好奇者的sn-p:

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

我正在尝试提取维基百科页面的来源,但是当涉及多行时,这种方法显然会失败。

【问题讨论】:

    标签: regex haskell functional-programming posix cabal


    【解决方案1】:

    您可能需要import Text.Regex.Base.RegexLike 才能访问makeRegexOpts 和朋友。

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

    好吧,既然Text.Regex.PosixdefaultCompOpt = 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>"
    

    【讨论】:

    • 效果很好,谢谢。另外,有什么方法可以只返回匹配项 (.*),还是只在 PCRE 中返回?
    【解决方案2】:

    如果您想做比 Posix 正则表达式更灵活或性能更好的事情,您可能需要使用 PCRE 后端。

    pcre-light 和 regex-pcre 都可以。

    【讨论】:

    • 肯定是首选,但是我们的研究小组必须在我们的大学服务器上运行它,他们可能会也可能不会批准添加新模块。
    【解决方案3】:

    我通过匹配解决了这种情况

    ((.*)|\n*)*
    

    尽管这可能并不总是有效,具体取决于您的表达方式。 如果可以的话,上述解决方案可能是最好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      相关资源
      最近更新 更多