这是与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"
但这并没有改变行为。
答案 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
。