(如果关于二进制文件的术语已经关闭,我会道歉 - 我仍然开始使用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:]
字符类引起的吗? (真正令我感到困惑的是,第一版和第二版都返回二进制版)
答案 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字符串
...