2011-12-14 15 views
5

Tengo algunos problemas con las expresiones regulares en haskell. Específicamente:Haskell regex sintaxis

Prelude Text.Regex.Posix> "1" =~ "\d" :: Bool 
<interactive>:1:10: 
    lexical error in string/character literal at character 'd' 
Prelude Text.Regex.Posix> "1" =~ "\\d" :: Bool 
False 
Prelude Text.Regex.Posix> "1" =~ "\\\\d" :: Bool 
False 

¿Se Haskell no tienen los \d o \s u otros códigos de escape convenientes? Sí, sé que puedo hacer [0-9] en su lugar, pero los códigos de escape pueden ser mucho más convenientes para expresiones regulares complejas. ¿Me estoy perdiendo algo obvio aquí?

+0

Sería genial ver una solución de ejemplo que realmente coincida con '\\ d' o alguna variante de esto, ya que todavía estoy luchando –

Respuesta

8

No sé mucho sobre los paquetes de expresiones regulares de Haskell, pero de sus ejemplos anteriores con "Text.Regex.Posix", podría inferir que está tratando con expresiones regulares de POSIX. Las secuencias de escape como \ d y \ s no forman parte de la sintaxis de la expresión regular POSIX, y creo que se originaron con Perl y desde entonces se han propagado a otros idiomas.

+0

Genial, no tenía idea de que ese era el caso. – So8res

+0

El módulo 'Text.Regex.Posix' utiliza enlaces de funciones foráneas a la API POSIX regex C, creo. Entonces es muy probable que sea correcto. –

14

No, Haskell no tiene secuencias de escape como \d y \s. Es decir. el lenguaje Haskell no los tiene. Porque el lenguaje Haskell tampoco tiene soporte para expresiones regulares. Solo hay algunas bibliotecas que proporcionan expresiones regulares.

Por lo tanto, debe buscar, ya sea que la biblioteca de expresiones regulares que está utilizando, sea compatible con \d y \s. Y cuando lo admiten, debe escribirlos como "\\d" en un archivo fuente Haskell.

Cuando \d proviene de Perl puede ser más exitoso con regex-pcre.

+0

+1 para señalar que las expresiones regulares son material de la biblioteca y que hacen alusión a '\\ d' – scravy