2015-02-10 76 views
1

背景

假設我在這裏有幾個Regex如何合併Regex?

import Text.Regex 

openTag = mkRegex "<([A-Z][A-Z0-9]*)\\b[^>]*>" 
closeTag = mkRegex "</\\1>" 
any = mkRegex "(.*?)" 

問題

openTag ++ any ++ closeTag < - 僅用於演示目的

我怎麼能合併嗎?具體來說,一個Regex -> Regex -> Regex函數。另外,轉換RegexString將是一件好事。

openTag ++ "hello" ++ closeTag < - 僅用於演示目的

因此,我最終能夠創建自己的Regex -> String -> Regex功能。

解決方法

操縱字符串文字。

import Text.Regex 

openTag = "<([A-Z][A-Z0-9]*)\\b[^>]*>" 
closeTag = "</\\1>" 
any = "(.*?)" 

tagWithAny = mkRegex $ openTag ++ any ++ closeTag 

tagWith :: String -> Regex 
tagWith s = mkRegex $ openTag ++ s ++ closeTag 
+0

不要你的意思是'正則表達式 - >正則表達式 - > Regex'? – Zeta 2015-02-10 15:04:56

+0

@Zeta是的,謝謝:) – Gavin 2015-02-10 15:10:09

+0

你不是真的想使用正則表達式的HTML/XML,是嗎?因爲沒有。 – dfeuer 2015-02-10 15:16:22

回答

8

Regex型在本質上Text.Regex是C指針:

data Regex = Regex (ForeignPtr CRegex) CompOption ExecOption 

AFAIK沒有辦法恢復POSIX正則表達式的字符串表示,它已被編譯之後。 regcomp 3 man page

如果您希望以代數形式運行正則表達式,請使用自己的類型進行換行以延遲編譯或使用例如regex-applicative

+0

這是非常可悲的。感謝您的快速回復@phadej。 – Gavin 2015-02-10 15:33:21