如何合并正则表达式?
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。
背景
假设我这里有几个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。