Соответствие конкретному символу Юникода в регулярном выражении haskell - PullRequest
8 голосов
/ 19 февраля 2011

Это проблема, связанная с Mac / OSX!

У меня есть следующие три символа длинной строки haskell:

"a\160b"

Я хочу сопоставить и заменить средний символ

Несколько подходов, таких как

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"

не дал желаемого результата.

Как мне изменить регулярное выражение или мою среду, чтобы заменить '\ 160' на 'X'?

Кажется, проблема в корне локали / кодировки ввода.

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

Я уже изменил свой .bashrc для экспорта следующих 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"

Но это никак не изменило поведение.

Ответы [ 2 ]

5 голосов
/ 24 февраля 2011

Я смог воспроизвести вашу проблему, установив в качестве локали «en_US.UTF-8». (Я также использую 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"))

Установка вашей локали на 'C' должна решить проблему:

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"

К сожалению, у меня нет объяснения, почему локаль вызывает эту проблему.

2 голосов
/ 19 февраля 2011

Есть ли конкретная причина, по которой вы хотите использовать регулярные выражения, а не просто map?

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

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

Обратите внимание, что если вы хотите работать со строками Unicode, вероятно, проще использовать пакет text, предназначенный для обработки Unicode, и более эффективный, чем String для больших строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...