在haskell regexp中匹配特定的unicode char

时间:2011-02-18 23:24:20

标签: regex macos unicode haskell

这是与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 个答案:

答案 0 :(得分:5)

我能够通过将我的语言环境设置为'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"

不幸的是,我没有解释为什么语言环境导致了这个问题。

答案 1 :(得分:2)

您是否有特定原因需要使用正则表达式,而不仅仅是map

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

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

请注意,如果您想使用Unicode字符串,则可能更容易使用旨在处理Unicode的text包,并且对于较大的字符串,效率高于String