Regex&;Haskell中的字符串库

Regex&;Haskell中的字符串库,regex,string,haskell,Regex,String,Haskell,我试着把Haskell介绍到我的日常生活中,用它来写一些附带的脚本等等 对于获取外部命令的结果很方便,但是当涉及到处理字符串结果时,我发现自己正在搜索。我来自ruby,那里的正则表达式是一流的,所以我习惯将它们作为工具 在haskell中进行字符串处理时,我应该阅读哪些库?搜索匹配行、提取字符串的匹配区域等等?中提供了正则表达式的详细介绍 更新:另一方面,对于命令处理和管道等,请签出。Haskell中有很多很棒的正则表达式库,但我们有更好的工具。现在让我们继续使用标准Haskell字符串(即字符

我试着把Haskell介绍到我的日常生活中,用它来写一些附带的脚本等等

对于获取外部命令的结果很方便,但是当涉及到处理字符串结果时,我发现自己正在搜索。我来自ruby,那里的正则表达式是一流的,所以我习惯将它们作为工具


在haskell中进行字符串处理时,我应该阅读哪些库?搜索匹配行、提取字符串的匹配区域等等?

中提供了正则表达式的详细介绍


更新:另一方面,对于命令处理和管道等,请签出。

Haskell中有很多很棒的正则表达式库,但我们有更好的工具。现在让我们继续使用标准Haskell字符串(即字符列表)。基本的都在Data.List中--。你有线条、未线条、文字、未使用词、takewhile、dropwhile等。还有
isPrefixOf
isInfixOf

您可能会相当直接地编写自己的递归函数,但这也是轻而易举的事。唯一真正缺少的操作是拆分操作,您可以使用brent的优秀软件包:

从根本上说,这个概念是希望对字符流进行增量处理


并不是所有的东西都尽可能的高效,特别是因为字符串表示没有那么高效。但是,如果/当你转向其他数据类型时,如何处理事物的核心概念将直接从基本字符串转换而来。

当我第一次自学Haskell时,我发现学习使用解析器组合器库进行字符串处理是一项了不起的投资。它们可以做正则表达式所能做的一切,甚至更多,编写组合分析器是建立关于类型类(如monad、applicative functor等)直觉的好方法


现在我倾向于使用它,但这可能是一个更好的起点,因为它有更广泛的文档记录和讨论,提供更好的错误消息等等。

我发现这是一个很好的起点:它只涵盖基本内容,没有高级主题,但最好从IMHO开始

注意事项:

  • haskell中的正则表达式的不同之处在于它们具有重载的返回类型。这意味着您可以从正则表达式匹配中提取许多不同类型的内容。(Bool、String、[String]等)根据您使用的返回类型,它将返回不同类型的答案(无论正则表达式是否匹配、匹配的测试、所有匹配的子组等等)。这是使用一些相当复杂的类型类voodoo完成的。上面的链接演示了基本类型,更完整的列表如下所示
  • haskell中实际上有多个提供正则表达式支持的标准模块(奇怪但真实)。上面的教程展示了POSIX模块,因为它在haskell中是标准的。如果你有阴谋集团,你也可以很容易地安装其他的正则表达式模块并使用它们。有一个pcre绑定(),以及一些通过DFAs工作的包(,等等)。使用如下命令进行安装:
    cabalinstallregexpcre
    ,您应该可以开始了。
    • (模块有一个标准化的接口,区别主要在于实现和regex风格)
  • haskell中有一个regex对象,但使用=~或=~~匹配运算符并不需要它。(只需使用字符串,转换将自动进行)。如果你的任务足够复杂,你想要一个第一类解析对象,考虑一下在其他答案中提到的PARSEC。

免责声明:我只真正使用pcre,所以我对其他软件包不太了解

你可以在haskell wiki上找到一个很棒的调查:在字符串的
尾部使用
isPrefixOf
不是更好,而是更糟。它更像是一个PITA,比一个好的字符串匹配器要慢。正如我所说的“并不是所有的东西都尽可能的高效”
isInfixOf
确实是我所指的。然而,写这本书很难“更像是一本皮塔书”。正如我所说的,核心概念是直截了当的。@Rapion:我还应该补充一点,如果你关注的是“好的字符串匹配器”,那么你根本不应该使用
[Char]
数据。文本有一个现成的好匹配器,还有一个很好的ByTestRing子字符串搜索包。我还没有读到“Parsec”一章,但我很期待。:)