2016-04-13 22 views
4

Grafiğin bir harf mi (veya hiyeroglif gibi sıklıkla kullanılan bir şey) olup olmadığını nasıl kontrol ederim?Grafeme bir mektup olup olmadığını nasıl kontrol edilir?

Elixir'in String belgelerine baktıktan sonra, görebildiğim tek yol, String.downcase ve String.upcase'un aynı dizgeyi döndürüp döndürmediğini kontrol etmektir. Yaparlarsa, o zaman grafik sözcüklerde kullanılan bir şey değildir.

Nasıl yaparım, ama kesinlikle daha basit bir yol olmalı?

defmodule Words do 
    defp all_letters_uppercase?(string) do 
    String.upcase(string) == string 
    end 

    defp all_letters_downcase?(string) do 
    String.downcase(string) == string 
    end 

    defp contains_letter?(string) do 
    not (all_letters_uppercase?(string) and all_letters_downcase?(string)) 
    end 

    def single_grapheme?(string) do 
    with graphemes = String.graphemes(string) 
    do 
     length(graphemes) == 1 and hd(graphemes) == string 
    end 
    end 

    @doc """ 
    Check whether string is a single letter. 
    """ 
    def letter?(string) do 
    single_grapheme?(string) and contains_letter?(string) 
    end 
end 

Güncelleme: kodum japon harflerle

iex(35)> Words.letter?("グ")    
false 

cevap

8

Sen \p{Letter} ya da kısaca \p{L} bunlardan biri bazı unicode özellikleri kontrol etmek için düzenli ifadeleri kullanabilirsiniz için çalışmaz. Birden fazla aşağıdaki birleştirici birleştirmeyle eşleştirmek için \p{Mark}* veya \p{M}*'u eklemek isteyebilirsiniz. Bu, String.graphemes/1'da bulunan mantıkla yakından eşleşir. Bu Unicode özelliklerini etkinleştirmek için regex'ten sonra u değiştiriciyi eklediğinizden emin olun. Örneğin:

iex> String.match?("グ", ~r/\A\p{L}\p{M}*\z/u) 
true 

Ayrıca http://erlang.org/doc/man/re.html, "Unicode karakter özellikleri" ve http://www.regular-expressions.info/unicode.html#grapheme bölümüne bakın.

0

Bu iyi çalışıyor gibi görünüyor:

defmodule Words do 
    def letter?(string) do 
    Regex.match?(~r/^\p{L}$/fu, string) 
    end 
end 


iex(51)> Words.letter?("a") 
true 
iex(52)> Words.letter?("é") 
true 
iex(53)> Words.letter?("グ") 
true 
iex(54)> Words.letter?("aa") 
false 
iex(55)> Words.letter?("1") 
false 
iex(56)> Words.letter?("-") 
false 
iex(57)> Words.letter?("") 
false 
iex(58)> Words.letter?(" ") 
false 
iex(59)> Words.letter?("éé") 
false 
iex(60)> Words.letter?("a ") 
false 
+0

Sadece benim 2 ¢: Eğer bütün girişi, '\ A' (dize başlangıcı) kullanabilir dizesi ve' \ z' eşleştirmek istiyorsanız (dize sonu) çapalar. Ben '^' (satırın başlangıcı) artı '$' (satır sonu) artı niyetini daha açık bir şekilde ifade etmek için 'f' (birinci satır) değiştiricisini buluyorum. –

+0

@PatrickOscity ilginç, bu çapaların olduğunu bile bilmiyordum. Nedense herkes ve köpeği '^' ve '$' kullanmaktadır. – CrabMan

+1

Bu, bir harf ve bir birleştirme karakteri içeren çoklu kod noktası grafikleriyle eşleşmiyor gibi görünmektedir. 'Words.letter? (" G̈ ") # => false' sorudaki kodunuz doğru olduğunda. – Dogbert

İlgili konular