Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir String.replace返回字符串的二进制表示形式_Elixir - Fatal编程技术网

Elixir String.replace返回字符串的二进制表示形式

Elixir String.replace返回字符串的二进制表示形式,elixir,Elixir,我在学习长生不老药的过程中遇到了一些对我来说没有意义的事情 我正在尝试删除标点符号 "Freude schöner Götterfunken" |> String.replace(~r/[^\s\w]/, "") #=> <<70, 114, 101, 117, 100, 101, 32, 115, 99, 104, 195, 110, 101, 114, 32, 71, 195, 116, 116, 101, 114, 102, 117, 110, 107, 101,

我在学习长生不老药的过程中遇到了一些对我来说没有意义的事情

我正在尝试删除标点符号

"Freude schöner Götterfunken" |> String.replace(~r/[^\s\w]/, "") #=> <<70, 114, 101, 117, 100, 101, 32, 115, 99, 104, 195, 110, 101, 114, 32, 71, 195, 116, 116, 101, 114, 102, 117, 110, 107, 101, 110>>
"Freude schöner Götterfunken" |> String.replace(~r/[^\w]/, "") #=> <<70, 114, 101, 117, 100, 101, 32, 115, 99, 104, 195, 110, 101, 114, 32, 71, 195, 116, 116, 101, 114, 102, 117, 110, 107, 101, 110>>
"Freude schöner Götterfunken" |> String.replace(~r/\p{P}/, "") #=> <<70, 114, 101, 117, 100, 101, 32, 115, 99, 104, 195, 110, 101, 114, 32, 71, 195, 116, 116, 101, 114, 102, 117, 110, 107, 101, 110>>
"Freude schöner Götterfunken" |> String.replace(~r/\s/, "") #=> FreudeschönerGötterfunken
"Hi my name is bob" |> String.replace(~r/\w/, "") #=> "    "
Regex.run(~r/[^\w]/, "Freude schöner Götterfunken") #=> [<<182>>]
“Freude schöner Götterfunken”|>String.replace(~r/[^\s\w]/,“”)#=>
“Freude schöner Götterfunken”|>String.replace(~r/[^\w]/,“”)#=>
“Freude schöner Götterfunken”|>String.replace(~r/\p{p}/,“”)#=>
“Freude schöner Götterfunken”|>String.replace(~r/\s/,“”)#=>FreudeschönerGötterfunken
“嗨,我的名字是鲍勃”|>String.replace(~r/\w/,“”)#=>“”
Regex.run(~r/[^\w]/,“Freude schöner Götterfunken”)#=>[]

这看起来像是一只虫子,但作为一个傻瓜,我假设自己是无知的。为什么替换不返回字符串

String.replace
返回一个“字符串”,但双引号字符串实际上作为二进制文件存储在Elixir中。由于某些原因,输出不能显示为常规字符串,因此,它会返回到显示二进制表示。

您是对的,string.replace/2没有返回字符串,因为Elixir将字符串定义为utf-8编码的二进制文件。但是,这不是一个bug,因为Elixir希望您传递或对参数执行有效的操作,因为它不会验证所有结果(因为代价昂贵)

例如,如果您将上面的任何二进制文件传递给
String.downcase/1
,Elixir将对它知道的部分进行downcase,而忽略其余部分。它之所以能工作是因为UTF-8自动同步,所以如果我们看到一些奇怪的东西,我们可以跳过这个奇怪的字节,继续进行操作

换句话说,Elixir中字符串处理的原理是在边界处进行验证(如打开文件、执行I/O或从数据库读取时),并假设我们一直在使用并执行有效的操作

好了,既然如此,为什么你的代码不起作用?原因是您的正则表达式没有启用unicode。让我们添加
u
修饰符,然后:

iex> "Freude schöner Götterfunken" |> String.replace(~r/[^\s\w]/u, "")
"Freude schöner Götterfunken"
嗯,这并不能解决你的问题,但至少结果是有效的。这意味着我们无法用unicode属性真正解决这个问题,因为在您的示例中,
ö
是一个与
\p{L}
属性匹配的单个代码点


也许在这种情况下最简单的解决方案,假设您只想为德语解决它,就是遍历二进制文件,保留字节以获得令人敬畏的答案!谢谢你的详细解释。我在阅读文档时遗漏了u修饰符。此处的“出于某种原因”:。注意下面的句子:“(请注意,如果任何字符超出ASCII范围,iex将只输出代码点)。”因为@matmer有超出ASCII范围的字符,所以整个内容显示为代码点。
iex> for <<x <- "Freude schöner Götterfunken">>, x <= 127, into: "", do: <<x>>
"Freude schner Gtterfunken"