2015-08-12 11 views
6

Chciałbym mieć klauzulę funkcji, która pasuje do pojedynczego znaku UTF-8.Dopasowanie do wzorca na dowolnym pojedynczym znaku UTF-8

można dopasować na konkretnych znaków jak to

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

Ale nie mogę stwierdzić, czy to możliwe, aby zrobić to samo dla dowolny pojedynczy znak UTF8.

Moje obecne rozwiązanie polega na podzieleniu łańcucha na listę znaków i dopasowanie wzorca na tym, ale byłem ciekawy, czy mogę pominąć ten krok.

Odpowiedz

8

Można to zrobić za pomocą:

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

Należy pamiętać, że to tylko pasuje do binarnych z pojedynczym znakiem, pasujące do następnego znaku w ciągu, można po prostu zrobić:

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

Od 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 

Więc możesz spróbować: ~ r /./ nam

Od 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 

Więc myślę, że powinno być dobrze iść.

+4

Rozwiązanie Regex jest w porządku, ale zwykle unikamy ich w Elixir, szczególnie gdy wystarczałoby dopasowanie binarne. :) –

+0

@ JoséValim możesz mi powiedzieć (lub wskazać na odniesienie), dlaczego należy unikać rozwiązania Regex? Jest to dla mnie ważne, odkąd jestem nowym uczniem Elixir. –

0

TL; DR:

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

Spójrz na https://github.com/elixir-lang/elixir/blob/3eb938a0ba7db5c6cc13d390e6242f66fdc9ef00/lib/elixir/unicode/unicode.ex#L48-L52 Można na czasie kompilacji funkcję dla każdego znaku wygenerować w formacie binarnym ("abc" w moim przykładzie). Tak działa wsparcie Unicode w Elixir, sprawdź cały moduł, aby lepiej zrozumieć.

+2

Wygląda na to, że nie musi generować tych podczas kompilacji. Zawsze może dopasować się do niego dynamicznie, jak na odpowiedź @bitwalker. –

+0

Całkowicie się zgadzam, rozumiem pytanie inaczej. Myślałem, że @lpil potrzebuje konkretnych znaków. –

Powiązane problemy