2015-08-12 23 views
6

Tôi muốn có một mệnh đề hàm khớp với bất kỳ ký tự UTF-8 nào.Khớp mẫu trên bất kỳ ký tự UTF-8 nào

tôi có thể phù hợp trên những nhân vật cụ thể như thế này

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

Nhưng tôi không thể xác định xem nó có thể làm tương tự cho bất kỳ nhân vật UTF8 duy nhất.

Giải pháp hiện tại của tôi là chia chuỗi thành danh sách char và khớp mẫu trên đó, nhưng tôi đã tò mò nếu tôi có thể bỏ qua bước đó.

Trả lời

8

Bạn có thể làm điều này với:

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

Lưu ý rằng điều này chỉ phù hợp với một nhị phân với một nhân vật duy nhất, để phù hợp trên nhân vật tiếp theo trong một chuỗi, bạn chỉ có thể làm:

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

Từ 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 

Vì vậy, bạn có thể thử: ~ r /./ chúng tôi

Từ 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 

Vì vậy, tôi nghĩ rằng bạn sẽ được tốt để đi.

+4

Các giải pháp Regex là ok nhưng chúng tôi thường tránh chúng trong Elixir, đặc biệt khi kết hợp mô hình nhị phân sẽ đủ. :) –

+0

@ JoséValim bạn có thể cho tôi biết (hoặc trỏ đến một tham chiếu) tại sao giải pháp Regex nên tránh? Điều quan trọng đối với tôi là tôi là người mới học Elixir. –

0

TL; DR:

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

Hãy xem https://github.com/elixir-lang/elixir/blob/3eb938a0ba7db5c6cc13d390e6242f66fdc9ef00/lib/elixir/unicode/unicode.ex#L48-L52 Bạn trên có thể biên dịch thời gian tạo chức năng cho từng nhân vật trong hệ nhị phân ("abc" trong ví dụ của tôi). Đó là cách Elixir unicode hỗ trợ hoạt động, kiểm tra toàn bộ mô-đun để hiểu rõ hơn.

+2

Nó không có vẻ như anh ta thực sự cần phải tạo ra những người tại thời gian biên dịch. Anh ấy luôn có thể tự động khớp với nó theo câu trả lời @bitwalker. –

+0

Hoàn toàn đồng ý, tôi hiểu câu hỏi khác nhau. Tôi nghĩ @ lpil cần một số ký tự đặc biệt. –

Các vấn đề liên quan