在Haskell中有几个可用于正则表达式的包(例如Text.Regex.Base,Text.Regex.Posix等)。到目前为止我见过的大多数软件包都使用了我所知道的正则表达式的一个子集,我的意思是:我习惯用以下的正则表达式将一个句子分成单词:
\\w+
到目前为止,我尝试的Haskell中的几乎所有软件包都不支持这个(至少前面提到的和Text.Regex.TDFA都没有)。我知道使用Posix,[[:word:] +]的用法会产生相同的效果,但我想使用上面提到的变体。
有两个问题:
答案 0 :(得分:10)
我会使用Adam的建议或(可能更具可读性)
> :m +Data.Char
> :m +Data.List.Split
> wordsBy (not . isLetter) "Just a simple test."
["Just","a","simple","test"]
这里不需要regexp。
答案 1 :(得分:9)
'\ w'是Perl模式,受PCRE支持,您可以使用我的regex-pcre包或pcre-light库在Haskell中访问它。如果您的输入是Char列表,则标准Prelude中的'words'功能可能就足够了;如果您的输入是ASCII字节串,则Data.ByteString.Char8可能有效。可能有一个带分词的utf8库,但我无法快速找到它。
答案 2 :(得分:5)
如果您想要闯入单词并过滤掉字母以外的内容,可以使用过滤器和isAlpha
或isAlphaNum
(或is
中的任何其他Data.Char
函数1}}满足您的需求。)
import Data.Char
wordsButOnlyLetters = map (filter isAlpha) . words
答案 3 :(得分:3)
单词功能效果很好,但它更像是用空格分隔,使用splitRegex。
import Text.Regex (splitRegex, mkRegex)
splitByWord :: String -> [String]
splitByWord = splitRegex (mkRegex "[^a-zA-Z]+")
>splitByWord "Word splitting with regular expressions in Haskell"
>["Word","splitting","with","regular","expressions","in","Haskell"]