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

时间:2015-08-21 21:16:01

标签: regex haskell

哈斯克尔诺布在这里。我正在使用regex-tdfa(没有特别的原因)来(尝试)匹配多行代码块文件(XAML,是的,我知道正则表达式和解析XML以及它们来自 - ponies-they-come-post )。

如果我在

这样的代码中使用简单的正则表达式
fileContents =~ "<UserControl.Resources>"

我的文件中有点击。耶。

如果我&#34;升级&#34;正则表达式&#34;&lt; UserControl.Resources&gt;。*&lt; /UserControl.Resources>&#34;,然后我没有点击。所以,我认为我的问题是多线正则表达式,并说服引擎匹配多行。

问题是,我是一个如此排名的菜鸟,我不知道该怎么做。我所知道的就是我从真实世界Haskell 了解你一个Haskell 中学到的东西,以及那些不讨论正则表达式编译选项的人。

所以,我可以强制结果像

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

但这就是我所知道的。

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

1 个答案:

答案 0 :(得分:1)

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