Idiomatic Elixir获取嵌套列表项?

时间:2016-06-10 04:41:29

标签: elixir

我有这个嵌套的列表项,

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

我只需要获取“xxxyyyxxxx123”值。

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

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

2 个答案:

答案 0 :(得分:4)

保持相同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"

答案 1 :(得分:1)

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

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

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