2011-12-07 41 views
10

Có một số gói có sẵn để sử dụng cụm từ thông dụng trong Haskell (ví dụ: Text.Regex.Base, Text.Regex.Posix, v.v.). Hầu hết các gói Tôi đã nhìn thấy cho đến nay sử dụng một tập hợp con của Regex tôi biết, mà tôi muốn nói: Tôi đang sử dụng để chia một câu diễn tả bằng lời với Regex sau:Tách từ bằng các cụm từ thông dụng trong Haskell

\\w+ 

Gần như tất cả các gói trong Haskell tôi đã cố gắng để đến nay không hỗ trợ điều này (ít nhất là đề cập trước đó và Text.Regex.TDFA không). Tôi biết rằng với Posix việc sử dụng [[: word:] +] sẽ có tác dụng tương tự, nhưng tôi muốn sử dụng biến thể được đề cập ở trên.

Từ có hai câu hỏi:

  1. Có bất kỳ gói lưu trữ đó?
  2. Nếu thực sự có, tại sao có cách sử dụng phổ biến khác?
  3. Lợi thế hoặc bất lợi là gì?
+4

Bạn có yêu cầu cụm từ thông dụng để tách các từ không? Có một hàm 'words' thực hiện chính xác những gì bạn muốn. –

+0

Cảm ơn, tôi không biết chức năng đó nhưng nó không làm những gì tôi muốn. Nếu có bất kỳ dấu chấm, dấu phẩy, vv trong một chuỗi, Regex sẽ bỏ qua chúng, nhưng 'từ' sẽ đính kèm chúng. Ví dụ: 'Prelude> words" Just a simple test. "' Sẽ cho kết quả '[" Just "," a "," simple "," test. "]' Tôi muốn nó không có dấu chấm. – beyeran

Trả lời

9

'\ w' là mẫu Perl và được PCRE hỗ trợ mà bạn có thể truy cập trong Haskell bằng gói regex-pcre hoặc thư viện pcre-light của mình. Nếu đầu vào của bạn là danh sách của Char thì hàm 'words' trong Prelude chuẩn có thể là đủ; nếu đầu vào của bạn là ASCII, thì Data.ByteString.Char8 có thể hoạt động. Có thể có một thư viện utf8 với từ tách, nhưng tôi không thể nhanh chóng tìm thấy nó.

5

Nếu bạn muốn đột nhập vào từ ngữ, và lọc ra những thứ khác hơn chữ cái, bạn có thể sử dụng bộ lọc và isAlpha hoặc isAlphaNum (hoặc bất kỳ các is các chức năng khác trong Data.Char đó phù hợp với nhu cầu của bạn.)

import Data.Char 

wordsButOnlyLetters = map (filter isAlpha) . words 
10

Tôi muốn sử dụng đề xuất của Adam hoặc (có thể dễ đọc hơn)

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

Không cần regexps ở đây.

+1

Chỉ là một lưu ý. Chia tách thành một từ không bằng nhau. Ví dụ, 'wordsBy (not. IsLetter)" Tôi muốn có 14 quả bóng. "' Return '[" I "," muốn "," have "," balls "]', nhưng '14' có thể là một từ thực sự. –

+0

@ ДМИТРИЙ Đây không phải là câu trả lời hoàn chỉnh. Trên thực tế '\ w' là' chữ cái ++ chữ số ++ "_" 'so' không. isLetter' chỉ là một trình giữ chỗ. Tôi muốn thể hiện mô hình tách dễ dàng và dễ hiểu. –

3

chức năng từ hoạt động tốt, nhưng nó giống như 'chia theo khoảng trắng', sử dụng 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"] 
Các vấn đề liên quan