为什么带有字符类的String.replace会将德语变音符号转换为二进制变量?

Fra*_*itt 2 elixir

(如果我的关于二进制文件的术语已经关闭,我会道歉 - 我仍然开始使用Elixir)

在解决Elixir的一个练习问题时,我注意到在使用角色类时String.replace,以及Regex.replace显然将德语元音变换为二进制[:alnum:]:

iex(1)> String.replace("ö", ~r/[[:alnum:]]/, "_")
<<95, 182>>
iex(2)> String.replace("ö", ~r/[^[:alnum:]]/, "_")
<<195, 95>>
iex(3)> String.replace("ö", ~r/[_]/, " ")
"ö"
Run Code Online (Sandbox Code Playgroud)

这种行为是由我使用的[:alnum:]字符类引起的吗?(真正令我感到困惑的是,第一版和第二版都返回二进制版)

Dog*_*ert 8

您需要将u修饰符传递给Regex,以便[:alnum:]在Unicode字符串上匹配其他此类模式.

iex(1)> String.replace("ö", ~r/[[:alnum:]]/u, "_")
"_"
iex(2)> String.replace("ö", ~r/[^[:alnum:]]/u, "_")
"ö"
Run Code Online (Sandbox Code Playgroud)

来自h Regex:

修饰符

创建正则表达式时可用的修饰符是:

  • unicode(u) - 启用unicode特定模式,如p和更改修饰符,如w,W,s和friends也匹配unicode.它期望在匹配时给出有效的unicode字符串

    ...