2015-08-12 16 views
6

Tek bir UTF-8 karakteriyle eşleşen bir işlev yan tümcesi olmasını isterim.Herhangi bir tek UTF-8 karakterinde desen eşleşmesi

Bu

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

gibi belirli karakterler eşleşebilir Ama bu mümkün herhangi tek UTF8 karakter için aynı şeyi ben belirleyemez.

Geçerli çözümüm, dizeyi bir char listesine ve desen eşlemesine bölmek, ancak bu adımı atlayabilir miyim diye merak ettim. 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 

itibaren

cevap

8

Sen ile yapabilirsiniz: Bu sadece bir dizede bir sonraki karakter üzerine eşleştirmek için bir tek karakteri ile ikili, eşleştiğini

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

Not yapmanız sadece yapabilirsiniz:

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

Yani deneyebilirsiniz: ~ r /./ bize

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

http://elixir-lang.org/crash-course.html itibaren Yani gitmek iyi olması gerektiğini düşünüyorum.

+4

Regex çözümü tamam ama bizler, özellikle ikili desen eşleşmesi yeterli olduğunda, bunları Elixir'de öneriyoruz. :) –

+0

@ JoséValim, Regex çözümünün neden kaçınılmasının gerektiğini (veya bir referansa işaret ettiğini) söyleyebilir misiniz? Elixir'in yeni öğrencisiyim diye benim için önemli. –

0

TL; DR:

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

ikili (bizim örneğimizde "abc") Her karakter için işlevini oluşturmak https://github.com/elixir-lang/elixir/blob/3eb938a0ba7db5c6cc13d390e6242f66fdc9ef00/lib/elixir/unicode/unicode.ex#L48-L52 bir göz Sen vakit derlemek olabilir atın. Elixir unicode desteği nasıl çalışır, daha iyi anlamak için tüm modülü kontrol edin.

+2

Gerçekten derleme zamanında bunları üretmesi gerekiyor gibi görünmüyor. @bitwalker cevabına göre her zaman dinamik olarak eşleşebilir. –

+0

Tamamen aynı fikirdeyim, farklı bir şekilde anlıyorum. @lpil'in bazı özel karakterlere ihtiyacı olduğunu düşündüm. –