2015-08-21 14 views
0

Haskell noob here。我正在使用regex-tdfa(没有特别的理由)(尝试)匹配多行代码文件(XAML,是的,我知道正则表达式和解析XML以及小马 - 它们会发布)。如何在regex-tdfa正则表达式中控制CompOption“multiline”? (Haskell)

如果我在代码中使用一个简单的regex像

fileContents =~ "<UserControl.Resources>" 

我得到的点击我的文件。好极了。

如果我 “升级” 的正则表达式像 “<UserControl.Resources> * </UserControl.Resources>”,然后我得到没有命中。所以,我想我的问题是多线正则表达式,并说服引擎匹配多行。

事情是,我是如此的排名noob我不知道该怎么做。我所知道的是我从了解到的真实世界Haskell了解你一个Haskell,那些不会谈论正则表达式编译选项。

所以,我可以强制的结果一样

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

但是,这是我所知道的。

如何关闭多行关闭? (我认为它的上,出于某种原因。)

+0

既然你知道它没有任何意义,试图解析使用正则表达式XML,你为什么要这么做它?顺便说一下,用于解析常规语言的最好的Haskell API是'regex-applicative'。 – dfeuer

+0

我是黑客,是为什么。感谢指向正则表达式的指针。请记住:Haskell noob。这是一个用Haskell编写的Perl脚本。我敢肯定,应用的东西是美好的,但我还没有。 – JohnL4

+0

关于应用和单点解析库的好处:它们很容易学习,一旦你学到了一个,它们都看起来很熟悉。最流行和最容易使用的是'attoparsec'。 – dfeuer

回答

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

+0

美丽,非常感谢。它像一个冠军(但你已经知道:))。 – JohnL4

相关问题