String.replace(-6ren">
gpt4 book ai didi

elixir - String.replace 返回字符串的二进制表示

转载 作者:行者123 更新时间:2023-12-04 13:07:00 25 4
gpt4 key购买 nike

我正在学习 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, 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>>]

这似乎是一个错误,但作为一个菜鸟,我假设无知。为什么替换不返回字符串?

最佳答案

你是对的 String.replace/2 没有返回字符串,因为 Elixir 将字符串定义为 utf-8 编码的二进制文件。但是,这不是错误,因为 Elixir 期望您对参数传递或执行有效操作,因为它不会验证所有结果(因为成本高昂)。

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

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

好吧,说了这么多,为什么你的代码不起作用?原因是您的正则表达式没有启用 unicode。让我们添加 u修改器然后:

iex> "Freude schöner Götterfunken" |> String.replace(~r/[^\s\w]/u, "")
"Freude schöner Götterfunken"

好吧,它不能解决您的问题,但至少结果是有效的。 Reading about unicode categories here意味着我们不能真正用 unicode 属性解决这个问题,因为 ö在您的示例中是与 \p{L} 匹配的单个代码点属性(property)。

也许在这种情况下最简单的解决方案是,假设您只想为德语解决它,只需遍历二进制文件,保持字节 <= 127。类似于:
iex> for <<x <- "Freude schöner Götterfunken">>, x <= 127, into: "", do: <<x>>
"Freude schner Gtterfunken"

如果您想要一个更完整的解决方案,您可能应该研究 unicode 音译。

关于elixir - String.replace 返回字符串的二进制表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26645834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com