2015-11-07 82 views
6

這是爲什麼falseUnicode和:阿爾法:

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 
+0

嘗試使用'/ u'修飾符:'〜r/^ [[:alpha:]] + $/u'。 –

+0

謝謝。我明白'u'修飾符。我也可以完成'\ p {L}'。我的問題是爲什麼'[:alpha:]'在這兩個例子中的工作方式不同? – mwoods79

+3

當您以非Unicode模式將字符串傳遞給正則表達式時,它將被視爲字節數組,而不是Unicode字符串。請參閱'IO.puts byte_size(「漢語漢語」)'和'IO.puts String.length(「漢語漢語」)'區別。字符串中的字節不能與'[:alpha:]'POSIX字符類匹配。因此,第一個表達式不起作用,而第二個表達式因爲它只需要1個字符來返回有效的匹配。 –

回答

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正則表達式庫(即在藥劑使用),需要用/u修改,以使Unicode模式:

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

IDEONE demo(打印true

Elixir regex reference

unicode (u) - 啓用Unicode的具體模式,比如\p並更改修飾符如\w,\W,\s和朋友也可以在unicode上匹配。它期望在匹配時給出有效的unicode字符串。