Warum ist das false
:Unicode und: alpha:
iex(1)> String.match?("汉语漢語", ~r/^[[:alpha:]]+$/)
false
Aber das ist true
:
iex(2)> String.match?("汉语漢語", ~r/[[:alpha:]]/)
true
Manchmal [:alpha:]
ist Unicode und manchmal ist es nicht?
EDIT:
Ich glaube nicht mein ursprüngliches Beispiel klar genug war.
Warum ist das false
:
iex(1)> String.match?("汉", ~r/^[[:alpha:]]+$/)
false
Aber das ist true
:
iex(2)> String.match?("汉", ~r/[[:alpha:]]/)
true
Versuchen Sie es mit dem Modifizierer '/ u':' ~ r/^ [[: alpha:]] + $/u'. –
Danke. Ich verstehe den Modifikator "u". Ich hätte auch '\ p {L}' machen können. Meine Frage ist, warum funktioniert '[: alpha:]' in diesen beiden Beispielen anders? – mwoods79
Wenn Sie die Zeichenfolge im Nicht-Unicode-Modus an die Regex übergeben, wird sie als Array von Bytes und nicht als Unicode-Zeichenfolge behandelt. Siehe 'IO.puts byte_size (" 汉语 漢語 ")' und 'IO.puts String.length (" 汉语 漢語 ")' Unterschied. Es gibt Bytes in der Zeichenfolge, die nicht mit der POSIX-Zeichenklasse "[: alpha:]" abgeglichen werden können. Daher funktioniert der erste Ausdruck nicht, während der zweite Ausdruck nur 1 Zeichen benötigt, um eine gültige Übereinstimmung zurückzugeben. –