处理大量文本数据时,建议使用Data.Text
而不是haskells本地字符串。检查,完成。但正则表达式怎么样?是否有正则表达式库,专门用于Data.Text
?据我所知,所有正则表达式库都在处理Haskell原生字符串或更糟糕的CStrings。
答案 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效率低,所以有些人更喜欢仍然使用绑定到后者。您将必须根据您使用正则表达式的内容来决定您的偏好。