Unicode和:alpha:

mwo*_*s79 7 regex elixir

为什么这样false:

iex(1)> String.match?("????", ~r/^[[:alpha:]]+$/)
false
Run Code Online (Sandbox Code Playgroud)

但这是true?:

iex(2)> String.match?("????", ~r/[[:alpha:]]/)
true
Run Code Online (Sandbox Code Playgroud)

有时候[:alpha:]是unicode,有时候不是吗?

编辑:

我认为我原来的例子不够清楚.

为什么这样false:

iex(1)> String.match?("?", ~r/^[[:alpha:]]+$/)
false
Run Code Online (Sandbox Code Playgroud)

但这是true?:

iex(2)> String.match?("?", ~r/[[:alpha:]]/)
true
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 11

当您以非Unicode模式将字符串传递给正则表达式时,它将被视为字节数组,而不是Unicode字符串.请参阅IO.puts byte_size("????")(12,输入包含的所有字节:)230,177,137,232,175,173,230,188,162,232,170,158IO.puts String.length("????")(4,Unicode"字母")的区别.字符串中有些字节无法与[:alpha:]POSIX字符类匹配.因此,第一个表达式不起作用,而第二个表达式起作用,因为它只需要1个字符来返回有效匹配.

要将Unicode字符串与PCRE正则表达式库(在Elixir中使用)正确匹配,您需要使用/u修饰符启用Unicode模式:

IO.puts String.match?("????", ~r/^[[:alpha:]]+$/u)
Run Code Online (Sandbox Code Playgroud)

查看IDEONE演示(打印true)

参见Elixir正则表达式参考:

unicode (u)-使得像unicode的具体模式\p和更改,如改性剂\w,\W,\s和朋友也匹配Unicode的.它期望在匹配时给出有效的unicode字符串.