返回非字符串输出的String.replace函数

jay*_*del 2 regex unicode elixir unicode-string

所以我有这个字符串,我想从中删除非字母数字字符:

my_string = "¿Habla usted Inglés, por favor?"
Run Code Online (Sandbox Code Playgroud)

基本上,在这种情况下,我想摆脱?,¿和。然后,我将单词分成一个列表,并与每个单词做各种处理。

我在用

String.replace(my_string, my_regex, "")
String.split(" ")
Run Code Online (Sandbox Code Playgroud)

做工作。我尝试使用两个不同的正则表达式字符串:

my_regex = ~r/[\_\.,:;\?¿¡\!&@$%\^]/
my_regex = ~r/[[:punct:]]/
Run Code Online (Sandbox Code Playgroud)

第一个作品就像一种魅力。我最终得到:

["habla", "usted", "inglés"]
Run Code Online (Sandbox Code Playgroud)

第二个删除正确的字符,但我最终得到:

[<<194, 104, 97, 98, 108, 97>>, "usted", <<105, 110, 103, 108, 195, 115>>]
Run Code Online (Sandbox Code Playgroud)

起初,我认为奇怪的输出仅仅是由于将非ASCII Alpha转储到控制台。但是,当我尝试与预期的字符串列表进行匹配时,它将失败。

无论如何,我只是不明白为什么两个不同的正则表达式根据列表中的字符串导致不同的输出。

这是可以在iex中运行以简洁地重现我的问题的代码:

a = ~r/[\_\.,:;\?¿¡\!&@$%\^]/
b = ~r/[[:punct:]]/
y = "¿Habla usted Inglés, por favor?"
String.replace(y, a, "")  
    # ->  "Habla usted Inglés por favor"
String.replace(y, b, "")
    # -> <<194, 72, 97, 98, 108, 97, 32, 117, 115, 116, 101, 100, 32, 73, 110, 103, 108, 195, 115, 32, 112, 111, 114, 32, 102, 97, 118, 111, 114>>
Run Code Online (Sandbox Code Playgroud)

Dea*_*lor 5

包括Unicode u标志以获得Unicode支持。

例如

a = ~r/[\_\.,:;\?¿¡\!&@$%\^]/u
b = ~r/[[:punct:]]/u
Run Code Online (Sandbox Code Playgroud)

可以看到在这里运行:https : //ideone.com/0nQKlq