2015-08-12 5 views
6

पर मैं एक फ़ंक्शन क्लॉज रखना चाहता हूं जो किसी एकल यूटीएफ -8 वर्ण से मेल खाता हो।पैटर्न एकल मिलान किसी भी यूटीएफ -8 चरित्र

मैं इस

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

जैसे विशिष्ट पात्रों पर मिलान कर सकते हैं लेकिन मैं अगर यह संभव किसी भी एकल UTF8 चरित्र के लिए भी ऐसा ही करने का निर्धारण नहीं किया जा सकता है।

मेरा वर्तमान समाधान स्ट्रिंग को एक चार सूची और पैटर्न मिलान में विभाजित करना है, लेकिन अगर मैं उस चरण को छोड़ सकता तो मैं उत्सुक था।

उत्तर

8

आप के साथ ऐसा कर सकते हैं:

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

ध्यान दें कि यह केवल एक ही चरित्र के साथ एक द्विआधारी, एक स्ट्रिंग में अगले वर्ण पर मैच के लिए मेल खाता है, तो आप सिर्फ कर सकते हैं:

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

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 

से तो तुम कोशिश कर सकते हैं: ~ r /./ हमें

से 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 

तो मुझे लगता है तुम जाना अच्छा होना चाहिए।

+4

रेगेक्स समाधान ठीक है, लेकिन हम आम तौर पर उन्हें एलिक्सीर से बचते हैं, विशेष रूप से जब बाइनरी पैटर्न मिलान पर्याप्त होता है। :) –

+0

@ जोसेवलिम क्या आप मुझे बता सकते हैं (या संदर्भ के लिए इंगित करें) रेगेक्स समाधान से क्यों बचा जाना चाहिए? यह मेरे लिए महत्वपूर्ण है क्योंकि मैं इलीक्सिर का एक नया शिक्षार्थी हूं। –

0

टी एल; डॉ:

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

https://github.com/elixir-lang/elixir/blob/3eb938a0ba7db5c6cc13d390e6242f66fdc9ef00/lib/elixir/unicode/unicode.ex#L48-L52 पर एक नजर डालें आप पर समय संकलन कर सकते हैं बाइनरी में हर किरदार के लिए समारोह उत्पन्न (मेरे उदाहरण में "abc")। इस तरह Elixir यूनिकोड समर्थन काम करता है, बेहतर समझने के लिए पूरे मॉड्यूल की जांच करें।

+2

ऐसा प्रतीत नहीं होता है कि उन्हें वास्तव में संकलन समय पर उत्पन्न करने की आवश्यकता है। @bitwalker उत्तर के अनुसार वह हमेशा गतिशील रूप से उस पर मेल खा सकता है। –

+0

पूरी तरह से सहमत हैं, मैं अलग-अलग प्रश्न समझता हूं। मैंने सोचा कि @ एलपीआईएल को कुछ विशेष वर्णों की जरूरत है। –

संबंधित मुद्दे