Unicode和:alpha:

时间:2015-11-07 18:46:35

标签: regex elixir

为什么这是false

iex(1)> String.match?("汉语漢語", ~r/^[[:alpha:]]+$/)
false

但这是true?:

iex(2)> String.match?("汉语漢語", ~r/[[:alpha:]]/)
true

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

编辑:

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

为什么这是false

iex(1)> String.match?("汉", ~r/^[[:alpha:]]+$/)
false

但这是true?:

iex(2)> String.match?("汉", ~r/[[:alpha:]]/)
true

1 个答案:

答案 0 :(得分:11)

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

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

IO.puts String.match?("汉语漢語", ~r/^[[:alpha:]]+$/u)

请参阅IDEONE demo(打印true

请参阅Elixir regex reference

  

unicode (u) - 启用unicode特定模式,例如\p和更改修饰符,例如\w\W\s和朋友也可以匹配unicode。它期望在匹配时给出有效的unicode字符串。