Разделение слов с регулярными выражениями в Haskell

Существует несколько пакетов для использования регулярных выражений в Haskell (например, Text.Regex.Base, Text.Regex.Posix и т.д.). Большинство пакетов, которые я видел до сих пор, используют подмножество Regex, которое я знаю, под которым я подразумеваю: я привык разбивать предложение на слова со следующим Regex:

\\w+

Почти все пакеты в Haskell, которые я пробовал до сих пор, не поддерживают это (по крайней мере, упомянутые ранее и Text.Regex.TDFA). Я знаю, что с Posix использование [[: word:] +] будет иметь тот же эффект, но я хотел бы использовать упомянутый выше вариант.

Из двух вопросов:

  • Есть ли какой-либо пакет для архивирования?
  • Если это действительно так, почему существует другое общее использование?
  • Какие преимущества или недостатки существуют?

Ответ 1

"\ w" - это шаблон Perl и поддерживается PCRE, доступ к которому вы можете получить в Haskell с моим пакетом regex-pcre или pcre-light. Если ваш вход представляет собой список Char, то функции "слов" в стандартной прелюдии могут быть достаточно; если ваш вход ASCII bytestring, то Data.ByteString.Char8 может работать. Может быть библиотека utf8 со словом, но я не могу быстро ее найти.

Ответ 2

Я бы использовал предложение Адама или (возможно, более читаемое)

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

Здесь нет необходимости в регулярных выражениях.

Ответ 3

Если вы хотите сломать слова и отфильтровать вещи, отличные от букв, вы можете использовать фильтры и isAlpha или isAlphaNum (или любые другие функции is в Data.Char, которые соответствуют вашим потребностям. )

import Data.Char

wordsButOnlyLetters = map (filter isAlpha) . words

Ответ 4

Функция слов

работает хорошо, но это больше похоже на "split by white space", используйте 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"]