2011-12-07 18 views
10

Esistono diversi pacchetti disponibili per l'utilizzo di espressioni regolari in Haskell (ad es. Text.Regex.Base, Text.Regex.Posix ecc.). La maggior parte dei pacchetti che ho visto fino ad ora utilizzano un sottoinsieme dei Regex Lo so, e con questo intendo: Sono abituato a dividere una frase in parole con la seguente espressione regolare:Suddivisione di parole con espressioni regolari in Haskell

\\w+ 

Quasi tutti i pacchetti a Haskell ho provato così lontano non supportano questo (almeno il già citato e Text.Regex.TDFA neanche). So che con Posix l'uso di [[: word:] +] avrebbe lo stesso effetto, ma mi piacerebbe usare la variante menzionata sopra.

Da lì sono due domande:

  1. Esiste un pacchetto di archiviare questo?
  2. Se c'è davvero, perché c'è un diverso utilizzo comune?
  3. Quali sono i vantaggi o gli svantaggi?
+4

Avete bisogno di espressioni regolari per dividere le parole? C'è una funzione 'words' che fa esattamente quello che vuoi. –

+0

Grazie, non conoscevo questa funzione ma non fa quello che voglio. Se ci sono punti, virgole, ecc. In una stringa, il Regex li ignorerebbe, ma le parole li attaccheranno. Es .: 'Preludio> parole" Solo un semplice test. "' Risulterebbe '[" Just "," a "," simple "," test. "]' Lo voglio senza il punto. – beyeran

risposta

9

Il '\ w' è un modello di Perl, e sostenuta da PCRE, cui è possibile accedere in Haskell con mio pacchetto regex-pcre o la libreria pcre-light. Se il tuo input è una lista di Char, la funzione 'words' nel Prelude standard può essere sufficiente; se il tuo input è ASCII, testalo allora Data.ByteString.Char8 potrebbe funzionare. Potrebbe esserci una libreria utf8 con suddivisione di parole, ma non riesco a trovarla rapidamente.

5

Se si vuole spezzare in parole, e filtrare le cose diversi da lettere, è possibile utilizzare il filtro e isAlpha o isAlphaNum (o una qualsiasi delle altre is funzioni in Data.Char che Suite vostro bisogno.)

import Data.Char 

wordsButOnlyLetters = map (filter isAlpha) . words 
10

userei il suggerimento di Adamo o (forse più leggibile)

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

Non c'è bisogno di espressioni regolari qui.

+1

Solo una nota. Divisione in parole non è uguale a quello. Ad esempio, 'wordsBy (not. IsLetter)" Voglio avere 14 palle. "' Return '[" I "," wanna "," have "," balls "]', ma '14' può essere effettivamente una parola. –

+0

@ ДМИТРИЙ Questa non dovrebbe essere una risposta completa. In realtà '\ w' è' lettere ++ cifre ++ "_" 'così' non. isLetter' è solo un segnaposto. Volevo mostrare un modello di divisione facile e comprensibile. –

3

funzione parole funziona bene, ma è più simile a 'raggruppati per spazio bianco', usare 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"]