【问题标题】:Pattern match on any single UTF-8 character任何单个 UTF-8 字符的模式匹配
【发布时间】:2015-11-05 17:08:49
【问题描述】:

我想要一个匹配任何单个 UTF-8 字符的函数子句。

我可以像这样匹配特定字符

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

但我无法确定是否可以对 any 单个 UTF8 字符执行相同操作。

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

【问题讨论】:

    标签: utf-8 binary pattern-matching elixir


    【解决方案1】:

    你可以这样做:

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

    请注意,这仅匹配具有单个字符的二进制文件,要匹配字符串中的下一个字符,您可以这样做:

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

    【讨论】:

      【解决方案2】:

      来自the Regex docs

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

      • unicode (u) - 启用像 \p 这样的 Unicode 特定模式,并更改像 \w\W\s 和朋友这样的修饰符以匹配 Unicode。它期望在匹配时给出有效的 Unicode 字符串
      • dotall (s) - 使 dot 匹配换行符并将换行符设置为 anycrlf;根据:re 文档,可以通过设置(*CR)(*LF)(*CRLF)(*ANY) 来覆盖新行设置

      所以你可以尝试: ~r/./us

      来自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
      

      所以我认为你应该很高兴。

      【讨论】:

      • Regex 解决方案没问题,但我们通常在 Elixir 中避免使用它们,特别是在二进制模式匹配就足够的情况下。 :)
      • @JoséValim 你能告诉我(或指向参考)为什么应该避免使用正则表达式解决方案吗?这对我很重要,因为我是 Elixir 的新手。
      【解决方案3】:

      TL;DR:

      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 unicode 支持的工作原理,请查看整个模块以更好地理解。

      【讨论】:

      • 看起来他并不真的需要在编译时生成这些。他总是可以根据@bitwalker 的回答动态匹配它。
      • 完全同意,我对问题的理解不同。我认为@lpil 需要一些特殊的字符。
      猜你喜欢
      • 2023-03-27
      • 2012-06-20
      • 2012-08-22
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2020-02-20
      相关资源
      最近更新 更多