如何在正则表达式中控制 CompOption "multiline"?(哈斯克尔)



Haskell新手。我正在使用regex-tdfa(没有特别的原因)来(尝试)匹配多行代码文件块(XAML,是的,我知道regex和解析XML以及the-ponie -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=~一样是多态的。

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

https://hackage.haskell.org/package/hledger -自由- 0.26/- docs/src/hledger跑龙套regex.html # Regexp

最新更新