【问题标题】:Idiomatic Elixir to get nested list item?惯用的 Elixir 获取嵌套列表项?
【发布时间】:2016-08-11 06:24:13
【问题描述】:

我有这个嵌套列表项,

[["Bearer"], ["xxxyyyxxxx123"]] #  parsed from "Bearer xxxyyyxxxx123"

我只需要获取“xxxyyyxxxx123”值。

我现在正在这样做,但我不认为这是惯用的。

token = Regex.scan(~r/^Bearer|\w+/, header_content)
        |> List.flatten
        |> List.last

【问题讨论】:

    标签: elixir


    【解决方案1】:

    保持相同Regex.scan/2 调用的惯用方法是使用模式匹配。

    iex(1)> header_content = "Bearer xxxyyyxxxx123"
    "Bearer xxxyyyxxxx123"
    iex(2)> [_, [token]] = Regex.scan(~r/^Bearer|\w+/, header_content)
    [["Bearer"], ["xxxyyyxxxx123"]]
    iex(3)> token
    "xxxyyyxxxx123"
    

    除非我遗漏了某些东西,否则匹配此字符串的更惯用方式(并且可能更有效)(它的功能不等同于您以前的正则表达式,但这对您来说可能是正确的)将使用不同的正则表达式和模式匹配:

    iex(4)> [_, token] = Regex.run(~r/Bearer\s*(.*)/, header_content)
    ["Bearer xxxyyyxxxx123", "xxxyyyxxxx123"]
    iex(5)> token
    "xxxyyyxxxx123"
    

    【讨论】:

    • 忽略整个单词作为匹配项是如此普遍,以至于:all_but_first 有一个选项。 [token] = Regex.run(~r/Bearer\s*(.*)/, header_content, capture: :all_but_first)
    • 我会联系String.split/1 - [_, token] = String.split(header_content),但我很想知道那些更有知识的人的意见。
    • 我同意——在 Elixir 中使用模式匹配几乎总是比任何其他选项都更惯用。
    【解决方案2】:

    如果只是为了匹配字符串"Bearer xxxyyyxxxx123",还有另一种惯用的 Elixir 方法。

    iex(1)> "Bearer " <> token = "Bearer xxxyyyxxxx123"
    "Bearer xxxyyyxxxx123"
    iex(2)> token
    "xxxyyyxxxx123"
    

    请注意,只有当第一部分是文字二进制文件时,您才能像这样匹配。它被记录为 Marco Kernel.<>/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多