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

时间:2016-05-02 19:13:17

标签: elixir

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

在解决其中一个Exercism questions for 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/[_]/, " ")
"ö"

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

1 个答案:

答案 0 :(得分:7)

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

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

来自h Regex

  

调节剂

     

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

     
      
  • unicode(u) - 启用unicode特定模式,如p和change   像w,W,s和朋友这样的修饰符也匹配unicode。它期望   匹配时给出的有效unicode字符串

         

    ...

  •