2015-08-21 50 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

相關問題