2011-02-18 17 views
8

¡Este es un problema relacionado con Mac/OSX!Coincidencia de unicode char específico en haskell regexp

tengo los siguientes tres caracteres de cadena larga Haskell:

"a\160b" 

Quiero que busque y sustituya el carácter medio

varios enfoques como

ghci> :m +Text.Regex 
ghci> subRegex (mkRegex "\160") "a\160b" "X" 
    "*** Exception: user error (Text.Regex.Posix.String died: (ReturnCode 17,"illegal byte sequence")) 
ghci> subRegex (mkRegex "\\160") "a\160b" "X" 
    "a\160b" 

no dió la deseada resultado.

¿Cómo debo modificar la expresión regular o mi entorno para reemplazar el '\ 160' con la 'X'?

Parece que el problema radica en la configuración regional/codificación de la entrada.

bash> locale 
LANG= 
LC_COLLATE="C" 
LC_CTYPE="UTF-8" 
LC_MESSAGES="C" 
LC_MONETARY="C" 
LC_NUMERIC="C" 
LC_TIME="C" 
LC_ALL= 

ya he modificado mi .bashrc para exportar los siguientes env-Vars:

bash> locale 
LANG="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_CTYPE="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_ALL="en_US.UTF-8" 

Pero esto no cambió el comportamiento en absoluto.

+1

¿Qué paquete de expresiones regulares está utilizando? Esto funciona para mí: 'Preludio Text.Regex>: m + Text.Regex Preludio Text.Regex> subRegex (mkRegex" \ 160 ")" a \ 160b "" X " " aXb " ' –

+0

''\ 160 '' es '& nbsp', puede haber alguna razón funky arcane Regex.Posix (en particular) no le gusta, como normalizarlo a un espacio normal. – barsoap

+0

Mi primer intento fue con: regex-base-0.93.2, regex-posix-0.94.2, regex-compat-0.93.1. Entonces probé con Text.Regex.TDFA con el mismo resultado. Estoy en una MacBook aquí, aparentemente este código se ejecuta en una máquina Linux, así que sospecho que hay algún problema con las bibliotecas subyacentes –

Respuesta

2

¿Hay alguna razón específica por la que desee utilizar expresiones regulares, y no simplemente map?

replace :: Char -> Char 
replace '\160' = 'X' 
replace c  = c 

test = map replace "a\160b" == "aXb" 

Tenga en cuenta que si usted quiere trabajar con cadenas Unicode, es probablemente más fácil de usar el paquete text que está diseñado para manejar Unicode, y más eficiente que String para las cadenas más grandes.

+1

Esto fue solo un ejemplo simplificado para enfatizar el problema con este mismo personaje. La expresión regular real se verá significativamente más compleja ... –

5

Pude reproducir su problema estableciendo mi configuración regional en 'en_US.UTF-8'. (También estoy usando MacOSX.)

bash> export LANG=en_US.UTF-8 
bash> ghci     
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help 
Prelude> :m +Text.Regex 
Prelude Text.Regex> subRegex (mkRegex "\160") "a\160b" "X" 
"*** Exception: user error (Text.Regex.Posix.String died: (ReturnCode 17,"illegal byte sequence")) 

Ajuste de la configuración regional de 'C' debería solucionar el problema:

bash> export LANG=C 
bash> ghci     
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help 
Prelude> :m +Text.Regex 
Prelude Text.Regex> subRegex (mkRegex "\160") "a\160b" "X" 
"aXb" 

Por desgracia, no tengo una explicación de por qué la configuración regional está causando este problema.

+0

Thx por el esfuerzo, pero mi Mac no aprueba - el mismo resultado ... –

+1

Estaba teniendo el mismo problema, y ​​esto resolvió mi problema. Gracias. No sé por qué no resolvió el problema del OP. – joom

Cuestiones relacionadas