在Haskell中使用正则表达式分割的单词

bey*_*ran 10 regex haskell

在Haskell中有几个可用于正则表达式的包(例如Text.Regex.Base,Text.Regex.Posix等).到目前为止我见过的大多数软件包都使用了我所知道的正则表达式的一个子集,我的意思是:我习惯用以下正则表达式将一个句子分成单词:

\\w+
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试过的Haskell中几乎所有的包都不支持这个(至少前面提到的和Text.Regex.TDFA都没有).我知道使用Posix时[[:word:] +]的用法会产生相同的效果,但我想使用上面提到的变体.

从有两个问题:

  1. 有存档的包吗?
  2. 如果真的存在,为什么会有不同的常用用法?
  3. 有什么优点或缺点?

Mat*_*nov 11

我会使用Adam的建议或(也许更具可读性)

> :m +Data.Char
> :m +Data.List.Split
> wordsBy (not . isLetter) "Just a simple test."
["Just","a","simple","test"]
Run Code Online (Sandbox Code Playgroud)

这里不需要正则表达式.


Chr*_*icz 10

'\ w'是一个Perl模式,由PCRE支持,您可以使用我的regex-pcre软件包或pcre-light库在Haskell中访问它.如果您的输入是Char列表,​​则标准Prelude中的'words'功能可能就足够了; 如果您的输入是ASCII字节串,那么Data.ByteString.Char8可能会起作用.可能有一个带分词的utf8库,但我无法快速找到它.


Ada*_*ner 5

如果你想闯入单词,并过滤掉字母以外的东西,你可以使用filter和isAlphaor isAlphaNum(或者你需要的那个套件中的任何其他is功能Data.Char.)

import Data.Char

wordsButOnlyLetters = map (filter isAlpha) . words
Run Code Online (Sandbox Code Playgroud)