2011-12-07 46 views
10

Existen varios paquetes disponibles para el uso de expresiones regulares en Haskell (por ejemplo, Text.Regex.Base, Text.Regex.Posix, etc.). La mayoría de los paquetes que he visto hasta ahora utilizan un subconjunto de expresiones regulares que sé, lo que quiero decir: estoy acostumbrado a dividir una frase en palabras con la siguiente expresión regular:División de palabras con expresiones regulares en Haskell

\\w+ 

Casi todos los paquetes en Haskell me trataron tan ahora no es compatible con esto (al menos los mencionados anteriormente y Text.Regex.TDFA tampoco). Sé que con Posix el uso de [[: word:] +] tendría el mismo efecto, pero me gustaría usar la variante mencionada anteriormente.

A partir de ahí son dos preguntas:

  1. ¿hay algún paquete para archivar eso?
  2. Si realmente existe, ¿por qué hay un uso común diferente?
  3. ¿Qué ventajas o desventajas hay?
+4

¿Necesita expresiones regulares para dividir las palabras? Hay una función 'words' que hace exactamente lo que quieres. –

+0

Gracias, no conocía esa función, pero no hace lo que quiero. Si hay puntos, comas, etc. en una cadena, la Regex los ignoraría, pero 'words' los adjuntaría. E.g .: 'Preludio> palabras" Sólo una simple prueba. '' Resultaría '[" Justo "," a "," simple "," prueba ".]' Lo quiero sin el punto. – beyeran

Respuesta

9

El '\ w' es un patrón Perl, y apoyados por PCRE, que se puede acceder en Haskell con mi regex-pcre paquete o la biblioteca pcre-light. Si su entrada es una lista de Char, entonces la función 'palabras' en el Preludio estándar puede ser suficiente; si su entrada es una cadena de bytes ASCII, entonces Data.ByteString.Char8 puede funcionar. Puede haber una biblioteca utf8 con división de palabras, pero no puedo encontrarla rápidamente.

5

Si quieres entrar en las palabras, y filtrar las cosas que no sean letras, se puede usar filtro y isAlpha o isAlphaNum (o cualquiera de las otras is funciones en Data.Char que habitación su necesidad.)

import Data.Char 

wordsButOnlyLetters = map (filter isAlpha) . words 
10

que haría uso de la sugerencia de Adán o (tal vez sea más legible)

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

No hay necesidad de expresiones regulares aquí.

+1

Solo una nota. Dividir en una palabra no es igual a eso. Por ejemplo, 'wordsBy (not. IsLetter)" Quiero tener 14 bolas. '' Return '[" I "," wanna "," have "," balls "]', pero '14' puede ser una palabra en realidad. –

+0

@ ДМИТРИЙ No se supone que sea una respuesta completa. En realidad, '\ w' es' letters ++ digits ++ "_" 'so' not. isLetter' es solo un marcador de posición. Quería mostrar un patrón de división fácil y comprensible. –

3

función de palabras funciona bien, pero es más como 'dividir por espacio en blanco', utilice 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"] 
Cuestiones relacionadas