如果 Elixir Regex 是用 PCRE 实现的,为什么它不支持 POSIX 字符类?

vae*_*r-k 0 regex elixir

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 实现,还是我无法理解正确的用法?

vae*_*r-k 5

事实证明,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)