如何合并正则表达式?

How to merge Regex?

背景

假设我这里有几个Regex

import Text.Regex

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

问题

openTag ++ any ++ closeTag <-- 仅供参考

如何合并它们?具体来说,一个 Regex -> Regex -> Regex 函数。或者,将 Regex 转换回 String 会很好。

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

Regex中的类型Text.Regex本质上是一个C指针:

data Regex = Regex (ForeignPtr CRegex) CompOption ExecOption

AFAIK 在编译后无法恢复 posix 正则表达式的字符串表示形式。 regcomp 3 man page.

如果您想对正则表达式进行代数运算,请将 then 包装在您自己的类型中以推迟编译或使用例如 regex-applicative