Разделение слов с регулярными выражениями в 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"]