Haskell:正则表达式和Data.Text

时间:2013-02-17 15:17:49

标签: regex haskell text

处理大量文本数据时,建议使用Data.Text而不是haskells本地字符串。检查,完成。但正则表达式怎么样?是否有正则表达式库,专门用于Data.Text?据我所知,所有正则表达式库都在处理Haskell原生字符串或更糟糕的CStrings。

2 个答案:

答案 0 :(得分:9)

我不知道Haskell,但无论编程语言如何,阅读documentation总是一个好主意。

  

使用扩展且非常丰富的函数系列来处理   Unicode文本(包括规范化,正则表达式,   非标准编码,文本破坏和语言环境),请参阅text-icu   包裹:http://hackage.haskell.org/package/text-icu

更准确地说是Data.Text.ICU.Regex

答案 1 :(得分:0)

正则表达式生态系统和Haskell

正则表达式是一种工具,人们从其他语言迁移,只是希望成为该语言中可用的工具之一。在编译语言中,此功能通常以PCRE等库的形式出现。脚本语言通常在语言中内置了正则表达式,但是解释器使用这些相同的库之一。

这是有充分理由的。有限状态自动机是相当神秘的,实现起来有点乏味,并且很难提高效率。为什么重新发明轮子?

那么Haskell有什么问题?好吧,这些众所周知的库都在8位字的数组上工作,这些字由NUL字节终止 - 在Haskell命名法中是CString。 Haskell中的常规字符串是Char的列表。 (字面意思是:type String = [Char])。这会导致两个问题:1)char是单个 unicode 字符,而不是8位字节。 (GHC在内部将Char存储为UTF16)和2)列表不是数组。这意味着如果我们想在Haskell中使用Regex,我们需要将文本转换为CStiring并对PCRE之类的内容进行外部调用,或者实现有效的有限状态自动机和regex parser natively

将unicode转换为ascii是一项有损且冒险的操作。有些库对它们正在处理的字符串做了一些假设并为你做了转换,其他库让你为它们构建CString,这样你就可以弄清楚当出现在游览文本中时要做什么。

那么Data.Text呢?它至少是一个数组,但在内部它是一个UTF16数组。仍然可以转换为8位CString,但效率不高。还可以使用unicode识别正则表达式引擎。 International Components for Unicode (ICU)such a library,并且text-icu包中有绑定。{3}} Unicode的本质意味着这个包比PCRE效率低,所以有些人更喜欢仍然使用绑定到后者。您将必须根据您使用正则表达式的内容来决定您的偏好。