【发布时间】:2011-06-30 04:15:00
【问题描述】:
这是 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 以导出以下环境变量:
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"
但这并没有改变行为。
【问题讨论】:
-
您使用的是什么正则表达式包?这对我有用:
Prelude Text.Regex> :m +Text.Regex Prelude Text.Regex> subRegex (mkRegex "\160") "a\160b" "X" "aXb" -
-
我的第一次尝试是:regex-base-0.93.2、regex-posix-0.94.2、regex-compat-0.93.1。然后我尝试使用 Text.Regex.TDFA 得到相同的结果。我在这里使用 MacBook,显然这段代码在 linux 机器上运行,所以我怀疑底层库存在问题
标签: regex macos unicode haskell