2011-10-24 40 views
17

我一直在尋找一些關於Haskell正則表達式的文檔或教程。 HaskellWiki page沒有有用的信息。它只是給出了神祕的消息:PCRE在Haskell - 什麼,在哪裏,如何?

Documentation 
Coming soonish. 

有一個簡短的blog post我發現相當有幫助的,但它僅與POSIX正則表達式,而不是PCRE交易。

我一直在Posix的正則表達式工作了幾個星期,我得出的結論是,我的任務,我需要PCRE。

我的問題是,我不知道從哪裏開始在Haskell PCRE。我已經下載regex-pcre-builtin與cabal,但我需要一個簡單的匹配程序的例子來幫助我開始。

  • 是否可以實現多行匹配?
  • 我可以用這種格式獲得匹配:[(MatchOffset,MatchLength)]
  • 我還能找到其他什麼格式的比賽?

非常感謝您的幫助!

回答

5

那麼,我寫了很多wiki頁面,可能寫了「即將推出」。 regex-pcre包是我使用regex-base接口封裝PCRE的地方,其中regex-base用作幾個非常不同的正則表達式引擎後端的接口。 Don Stewart的pcre-light包沒有這個抽象層,因此更小。

Text.Regex.Posix上的博客文章使用了我的regex-posix包,它也位於正則表達式基礎之上。因此,regex-pcre的使用將非常類似於該博客文章,除了PCRE的編譯&執行選項不同之外。

對於配置正則表達式pcre Text.Regex.PCRE.Wrap module具有您需要的常量。使用regex-base中的makeRegexOptsM來指定選項。

10

有希望在Haskell使用PCRE風格的正則表達式時,兩個主要選項:

  • regex-pcre使用在RWH在博客中(以及相同的接口,因爲我認爲一個擴大版的博客文章);這可以選擇擴展pcre-lessregex-pcre-builtin似乎是此版本的預發佈快照,可能不應使用。

  • pcre-light綁定到PCRE庫。它不提供你之後的返回類型,只是所有的匹配(如果有的話)。 但是pcre-light-extras程序包提供了一個MatchResult類,爲此您可能會提供這樣一個實例。這可以使用regexqq來增強,它允許您使用準引號來確保您的正則表達式模式類型檢查;然而,它不適用於GHC-7(除非有人接管維護它,否則它不會)。

因此,假設你去regex-pcre

  • this回答,是的。

  • 我想是的,通過MatchArray類型(它返回一個數組,然後你可以從列表中取出)。

  • 查看here從正則表達式的所有可能的結果。

+0

當我嘗試用於多行匹配的方法時,出現錯誤「不在範圍內」compNewLine''。我認爲它只適用於Posix。 –

+0

@NickBrunt [compMultiline](http://hackage.haskell.org/packages/archive/regex-pcre/0.94.2/doc/html/Text-Regex-PCRE-Wrap.html#v:compMultiline)也許呢? – ivanm

+0

不是pcre-light-extras是一個矛盾嗎? – mcandre

5

regexpr是另一個PCRE-ish庫,它是跨平臺的,可以快速入門。

9

還有我寫的regex-applicative

這個想法是,您可以爲每個正則表達式分配一些含義,然後將它們組合起來,就像使用Parsec編寫解析器一樣。

下面是一個示例 - 簡單的URL解析。

import Text.Regex.Applicative 

data Protocol = HTTP | FTP deriving Show 

protocol :: RE Char Protocol 
protocol = HTTP <$ string "http" <|> FTP <$ string "ftp" 

type Host = String 
type Location = String 
data URL = URL Protocol Host Location deriving Show 

host :: RE Char Host 
host = many $ psym $ (/= '/') 

url :: RE Char URL 
url = URL <$> protocol <* string "://" <*> host <* sym '/' <*> many anySym 

main = print $ "http://stackoverflow.com/questions" =~ url 
+1

Oooohhh,那看起來不錯! – ivanm

2

我發現rex是相當不錯過,其ViewPatterns整合是一個不錯的主意,我認爲。

雖然它可能很冗長,但部分與正則表達式有關。

parseDate :: String -> LocalTime 
parseDate [rex|(?{read -> year}\d+)-(?{read -> month}\d+)- 
     (?{read -> day}\d+)\s(?{read -> hour}\d+):(?{read -> mins}\d+): 
     (?{read -> sec}\d+)|] = 
    LocalTime (fromGregorian year month day) (TimeOfDay hour mins sec) 
parseDate [email protected]_ = error $ "invalid date " ++ v 

這就是說我剛剛發現正則表達式,應用性在其他的答案中提及了,它可能是一個更好的選擇,可能會更簡潔和更地道,但雷克斯,如果你知道正則表達式基本爲零的學習曲線這可以是一個優點。