2016-05-01 6 views
3

Ich muss erkennen, ob ein Codepoint ein Großbuchstabe in Elixir ist. Ich habe versucht zu überprüfen, ob es Wert im Bereich 65..90 ist, aber das scheitert an nicht-lateinischen Großbuchstaben. Ich habe auch versucht, zu überprüfen, obFinden Sie, ob Codepunkt in Elixir Großbuchstaben

String.upcase(cp) == cp

jedoch versagt diese auf nicht-Buchstaben (dh Zahlen, Satzzeichen).

Ich möchte wirklich nicht durch die Gesamtheit von Unicode gehen und eine Liste von Großbuchstaben Codepoints erstellen, gibt es eine eingebaute Funktion dafür?

Antwort

9

können Sie die \p{Lu} Unicode-Zeichen Eigenschaft regex Escape-Sequenz verwenden, um alle Großbuchstaben entsprechen:

iex(1)> "a" =~ ~r/^\p{Lu}$/u 
false 
iex(2)> "A" =~ ~r/^\p{Lu}$/u 
true 
iex(3)> "π" =~ ~r/^\p{Lu}$/u 
false 
iex(4)> "Π" =~ ~r/^\p{Lu}$/u 
true 
iex(5)> "!" =~ ~r/^\p{Lu}$/u 
false 

Achten Sie darauf, die u Flagge auf Unicode Anpassung in der Regex drehen passieren.

Weitere Informationen zu den unterstützten Eigenschaften finden Sie auf der Seite this. Suchen Sie auf der Seite nach der Überschrift "Unicode-Zeicheneigenschaften".

+1

Beachten Sie, dass Reguläre Ausdrücke im Vergleich zu z. Mustererkennung. Es gibt [einen Vorschlag, der Elixir-Standardbibliothek Funktionalität wie diese hinzuzufügen (https://groups.google.com/forum/#!topic/elixir-lang-core/DU-_euhvVk0), obwohl sie stattdessen hinzugefügt werden könnte zu einem separaten Hex-Paket, da die Unicode-Bibliothek bereits sehr groß ist. – Qqwy

+0

Dies schlägt bei mehrzeiligen Strings fehl ('" A \ na "' wird als oberflächlich erkannt, obwohl es unwahrscheinlich sein sollte.) Bitte korrigieren Sie es, '\ A' und' \ z' Terminatoren zu verwenden, danke. – mudasobwa

1

Ich glaube, Sie so etwas wie dies nutzen könnten:

<< *CODEPOINT* :: utf8 >> != String.downcase(<< *CODEPOINT* :: utf8 >>) 

gibt es vielleicht einen besseren Weg, aber das ist der Anfang.

Verwandte Themen