regex - 如何在 regex-tdfa 正则表达式中控制 CompOption "multiline"? ( haskell )

标签 regex haskell

这里是 Haskell 菜鸟。我正在使用 regex-tdfa(无特殊原因)来(尝试)匹配多行代码文件 block (XAML,是的,我知道正则表达式和解析 XML 以及 the-ponies-they-come post)。

如果我在代码中使用简单的正则表达式

fileContents =~ "<UserControl.Resources>"

我的文件被点击了。是的。

如果我将正则表达式“升级”为“.*”之类的内容,那么我将无法获得任何匹配。所以,我认为我的问题是多行正则表达式和说服引擎跨多行匹配。

问题是,我是一个菜鸟,我不知道该怎么做。我所知道的是我从 Real World HaskellLearn You a Haskell 中学到的东西,而这些并没有谈论正则表达式编译选项。

所以,我可以强制结果如

fileContents =~ "<UserControl.Resources>" :: (String, String, String)

但这就是我所知道的。

如何关闭多线? (出于某种原因,我认为它已开启。)

最佳答案

regex-tdfa 编译选项的定义可以在这里找到:

https://hackage.haskell.org/package/regex-tdfa-1.2.0/docs/src/Text-Regex-TDFA-Common.html#CompOption

文档说 multiLine 默认设置为 True

这是一种使用自定义选项编译和执行正则表达式的方法:

{-# LANGUAGE FlexibleContexts #-}

import Text.Regex.TDFA

toRegex = makeRegexOpts defaultCompOpt{multiline=False} defaultExecOpt

test str =
  if match (toRegex "<Tag>.*</Tag>") str
    then putStrLn "matches"
    else putStrLn "does not match"

test2 fileContents =
    match (toRegex "<Tag>.*</Tag>") fileContents :: (String, String, String)

请注意,match 是多态的,就像 =~ 一样。

您可以在 hledger-lib 包中找到使用自定义正则表达式选项的代码:

https://hackage.haskell.org/package/hledger-lib-0.26/docs/src/Hledger-Utils-Regex.html#Regexp

关于regex - 如何在 regex-tdfa 正则表达式中控制 CompOption "multiline"? ( haskell ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32149354/

相关文章:

PHP:如何替换特定标签及其结束标签?

ios - 使用 OCR 识别 double 或 S 中的数字 5

php - 下滚动后的字符串最后一位数字

haskell - 在我自己实现之前寻找一个标准的 Haskell 习语

haskell - 在 Haskell 中执行 while 循环

haskell - 翻转修复/修复

Java 数组 - split() 与用户指定的分隔符

regex - 如何从url中提取域名?

haskell - Hamlet 自动访问范围内的变量

haskell - 现在是否允许在实例声明中使用类型签名而不需要 InstanceSigs 语言扩展?