任何单个UTF-8字符上的模式匹配

任何单个UTF-8字符上的模式匹配,utf-8,binary,pattern-matching,elixir,Utf 8,Binary,Pattern Matching,Elixir,我希望有一个与任何单个UTF-8字符匹配的函数子句 我可以匹配像这样的特定角色 def foo("a") do "It's an a" end 但我无法确定是否可以对任何单个UTF8字符执行相同的操作 我目前的解决方案是将字符串拆分为一个字符列表,并在上面进行模式匹配,但我很好奇是否可以跳过这一步。来自: 创建正则表达式时可用的修饰符有: unicode(u)-启用unicode特定模式,如\p,并更改修改器,如\w、\w、\s和朋友,使其也在unicode上匹配。它希望在匹配时提供有效

我希望有一个与任何单个UTF-8字符匹配的函数子句

我可以匹配像这样的特定角色

def foo("a") do
  "It's an a"
end
但我无法确定是否可以对任何单个UTF8字符执行相同的操作

我目前的解决方案是将字符串拆分为一个字符列表,并在上面进行模式匹配,但我很好奇是否可以跳过这一步。

来自:

创建正则表达式时可用的修饰符有:

  • unicode
    (u)-启用unicode特定模式,如
    \p
    ,并更改修改器,如
    \w
    \w
    \s
    和朋友,使其也在unicode上匹配。它希望在匹配时提供有效的Unicode字符串
  • dotall
    (s)-使点匹配换行符,并将换行符设置为anycrlf;根据
    :re
    文档,通过设置
    (*CR)
    (*LF)
    (*CRLF)
    (*ANY)
    可以覆盖新行设置
因此,您可以尝试: ~r//我们

所以我认为你应该很乐意去;博士:

for <<char <- "abc">> do
  def foo(unquote(<<char>>)), do: "It's an #{unquote(<<char>>)}"
end
对于,您可以使用以下工具执行此操作:

def char?(<<c::utf8>>), do: true
def char?(_), do: false
def char?(),do:true
def char(?),do:false
请注意,这仅匹配具有单个字符的二进制文件,要匹配字符串中的下一个字符,您只需执行以下操作:

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

Regex解决方案是可以的,但我们通常在Elixir中避免使用它们,特别是当二进制模式匹配就足够时。:)@JoséValim您能告诉我(或指向参考资料)为什么应该避免使用正则表达式解决方案吗?这对我来说很重要,因为我是长生不老药的新手。他似乎并不真的需要在编译时生成这些。他总是可以根据@bitwalker答案动态匹配。完全同意,我对问题的理解不同。我想@lpil需要一些特殊的字符。
def char?(<<c::utf8, _rest::binary>>), do: true