哈斯克尔诺布在这里。我正在使用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)
但这就是我所知道的。
如何关闭多线? (我认为它是开启的,出于某种原因。)
答案 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