2015-11-07 7 views
6

はなぜこのfalseです:Unicodeと:アルファ:

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

しかし、これはtrueです:?

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

時々[:alpha:]はユニコードで、時にはそうではありませんか?

編集:

私の元の例では十分とは言えません。

なぜこの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}'もやっていました。私の質問は、なぜこれらの2つの例で '[:alpha:]'の動作が異なっているのでしょうか? – mwoods79

+3

文字列を非Unicodeモードで正規表現に渡すと、Unicode文字列ではなくバイト配列として扱われます。 'IO.puts byte_size("汉语漢語 ")'と 'IO.puts String.length("汉语漢語 ")'の違いを参照してください。 '[:alpha:]' POSIX文字クラスとマッチできない文字列にバイトがあります。したがって、最初の式は機能しませんが、2番目の式は有効な一致を返すためには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の「文字」)の違いを参照してください。 POSIX文字クラス[:alpha:]と一致できない文字列内のバイトがあります。したがって、最初の式は機能しませんが、2番目の式は有効な一致を返すために1文字しか必要としません。適切PCRE正規表現ライブラリでUnicode文字列に一致するように

(それはエリクサーで使用されている)、あなたは/u修飾子でUnicodeモードを有効にする必要があります。

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

IDEONE demo(プリントをtrue)を参照してください

Elixir regex reference

unicode (u) -のようなユニコード固有のパターンを可能にするなどの修飾語句を変更し、\w,\W,\sなどの変更を加えて、ユニコードでも一致させる必要があります。それは、マッチで有効なユニコード文字列が与えられることを期待しています。