2015-08-12 4 views
6

Mi piacerebbe avere una clausola di funzione che corrisponda a qualsiasi singolo carattere UTF-8.Pattern match su qualsiasi singolo carattere UTF-8

possibile riprodurre esattamente sui caratteri specifici come questo

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

Ma non può determinare se possibile, a fare lo stesso per qualsiasi singolo carattere UTF8.

La mia soluzione attuale è quella di dividere la stringa in una lista char e la corrispondenza del modello su quella, ma ero curioso di saltare questo passaggio.

risposta

8

Si può fare questo con:

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

Si noti che questo corrisponde a un binario con un singolo carattere, per abbinare il carattere successivo in una stringa, basta che si può fare:

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

Da 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 

così si potrebbe provare: ~ r /./ ci

Da 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 

Quindi penso che si dovrebbe essere pronti per partire.

+4

La soluzione Regex è ok, ma in genere li evitiamo in Elixir, specialmente quando la corrispondenza di pattern binari è sufficiente. :) –

+0

@ JoséValim potresti dirmi (o indicare un riferimento) perché la soluzione Regex dovrebbe essere evitata? È importante per me dal momento che sono un nuovo allievo di Elisir. –

0

TL; DR:

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

Date un'occhiata a https://github.com/elixir-lang/elixir/blob/3eb938a0ba7db5c6cc13d390e6242f66fdc9ef00/lib/elixir/unicode/unicode.ex#L48-L52 È possibile compilare il tempo di funzione per ogni personaggio generare in binario ("abc" nel mio esempio). È così che funziona il supporto per Einir Unicode, controlla l'intero modulo per capire meglio.

+2

Non sembra che abbia davvero bisogno di generare quelli in fase di compilazione. Può sempre abbinarlo dinamicamente secondo la risposta di @bitwalker. –

+0

Totalmente d'accordo, comprendo la domanda in modo diverso. Ho pensato che @lpil avesse bisogno di alcuni caratteri particolari. –