ElixirRegex基于Erlang:re模块,该模块在其文档中指出
Perl 支持字符类的 Posix 表示法。这使用由 [: 和 :] 括在方括号内的名称。PCRE 也支持这种表示法。
POSIX 字符类可以用\p操作符 à la Unicode Properties或括号类表示法表示,如此处和:re文档中所述。
然而,这些是我在使用 Elixir 1.9 的系统上看到的结果:
iex(1)> Regex.run(~r/\p{L}+/, "Götterfunken")
[<<71, 195>>]
Run Code Online (Sandbox Code Playgroud)
我希望上面的内容匹配搜索词中的所有字符。
iex(2)> Regex.run(~r/[[:alpha:]]+/, "Götterfunken")
[<<71, 195>>]
Run Code Online (Sandbox Code Playgroud)
同样,我希望所有字符都匹配,但我不确定是否:alpha:应该匹配非拉丁字符。
iex(3)> Regex.run(~r/[[:punct:]]/, "Götterfunken")
[<<182>>]
Run Code Online (Sandbox Code Playgroud)
在这里,我预计根本没有比赛。
这是 Elixir 中损坏的 Regex 实现,还是我无法理解正确的用法?
事实证明,ElixirRegex模块提供了一个选项来打开对 Unicode 的支持:
unicode(u) - 启用 Unicode 特定模式(如 \p)和更改修饰符(如 \w、\W、\s 和朋友)以匹配 Unicode。它期望在匹配时给出有效的 Unicode 字符串
这意味着问题中的问题示例可以这样解决:
iex(1)> Regex.run(~r/\p{L}+/u, "Götterfunken")
["Götterfunken"]
iex(2)> Regex.run(~r/[[:alpha:]]+/u, "Götterfunken")
["Götterfunken"]
iex(3)> Regex.run(~r/[[:punct:]]/u, "Götterfunken")
nil
Run Code Online (Sandbox Code Playgroud)