2015-08-12 16 views
6

Ich möchte eine Funktionsklausel haben, die mit jedem einzelnen UTF-8-Zeichen übereinstimmt.Musterübereinstimmung für jedes einzelne UTF-8-Zeichen

Ich kann wie diese

def foo("a") do 
    "It's an a" 
end 

Aber ich kann nicht feststellen, auf bestimmte Zeichen übereinstimmen, wenn es möglich, das gleiche gilt für jeden einzelnen UTF8 Charakter zu tun.

Meine aktuelle Lösung ist es, die Zeichenfolge in eine Char-Liste und Muster-Match auf diese zu teilen, aber ich war neugierig, ob ich diesen Schritt überspringen könnte.

Antwort

8

Sie können dies tun mit:

def char?(<<c::utf8>>), do: true 
def char?(_), do: false 

Beachten Sie, dass dies nur ein binäres mit einem einzelnen Zeichen übereinstimmt, auf das nächste Zeichen in einer Zeichenfolge übereinstimmen, können Sie einfach tun:

def char?(<<c::utf8, _rest::binary>>), do: true 
1

Von http://elixir-lang.org/docs/v1.0/elixir/Regex.html

The modifiers available when creating a Regex are: ... 

unicode (u) - enables unicode specific patterns like \p and changes modifiers like \w, \W, \s and friends to also match on unicode. It expects valid unicode strings to be given on match 

dotall (s) - causes dot to match newlines and also set newline to anycrlf; the new line setting can be overridden by setting (*CR) or (*LF) or (*CRLF) or (*ANY) according to re documentation 

So können Sie versuchen: ~ r /./ uns

Von http://elixir-lang.org/crash-course.html

In Elixir, the word string means a UTF-8 binary and there is a String module that works on such data 

Also ich denke, Sie sollten gut zu gehen.

+4

Die Regex-Lösung ist in Ordnung, aber wir vermeiden sie normalerweise in Elixir, besonders wenn die binäre Mustererkennung ausreicht. :) –

+0

@ JoséValim können Sie mir sagen (oder verweisen auf eine Referenz), warum die Regex-Lösung vermieden werden sollte? Es ist wichtig für mich, da ich Elixir neu lerne. –

0

TL; DR:

for <<char <- "abc">> do 
    def foo(unquote(<<char>>)), do: "It's an #{unquote(<<char>>)}" 
end 

Werfen Sie einen Blick auf https://github.com/elixir-lang/elixir/blob/3eb938a0ba7db5c6cc13d390e6242f66fdc9ef00/lib/elixir/unicode/unicode.ex#L48-L52 können Sie auf Zeit erzeugen Funktion für jedes Zeichen in binären ("abc" in meinem Beispiel) kompilieren. So funktioniert Elixir-Unicode-Unterstützung, schauen Sie sich das gesamte Modul an, um es besser zu verstehen.

+2

Es scheint nicht so, als müsste er diese zur Kompilierzeit erzeugen. Er kann immer dynamisch nach @bitwalker antworten. –

+0

Völlig einverstanden, verstehe ich Frage anders. Ich dachte @lpil braucht ein paar besondere Zeichen. –

Verwandte Themen