【问题标题】:Matching specific unicode char in haskell regexp在haskell regexp中匹配特定的unicode char
【发布时间】: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


【解决方案1】:

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

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

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

请注意,如果您想处理 Unicode 字符串,使用设计用于处理 Unicode 的 text 包可能更容易,并且对于较大的字符串比 String 更有效。

【讨论】:

  • 这只是一个简化的例子来强调这个角色的问题。实际的正则表达式看起来要复杂得多..
【解决方案2】:

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

很遗憾,我无法解释为什么语言环境会导致此问题。

【讨论】:

  • 我遇到了同样的问题,这解决了我的问题。谢谢你。我不知道为什么它没有解决 OP 的问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多