我有這樣的嵌套列表項,地道藥劑獲取嵌套列表項目?
[["Bearer"], ["xxxyyyxxxx123"]] # parsed from "Bearer xxxyyyxxxx123"
,我只需要獲得「xxxyyyxxxx123」值。
我現在正在這樣做,但我不認爲它是慣用的。
token = Regex.scan(~r/^Bearer|\w+/, header_content)
|> List.flatten
|> List.last
我有這樣的嵌套列表項,地道藥劑獲取嵌套列表項目?
[["Bearer"], ["xxxyyyxxxx123"]] # parsed from "Bearer xxxyyyxxxx123"
,我只需要獲得「xxxyyyxxxx123」值。
我現在正在這樣做,但我不認爲它是慣用的。
token = Regex.scan(~r/^Bearer|\w+/, header_content)
|> List.flatten
|> List.last
保持相同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"
如果只是字符串匹配"Bearer xxxyyyxxxx123"
,還有另一個慣用藥劑的方式來做到這一點。
iex(1)> "Bearer " <> token = "Bearer xxxyyyxxxx123"
"Bearer xxxyyyxxxx123"
iex(2)> token
"xxxyyyxxxx123"
請注意,您可以匹配這樣只有第一部分是文字二進制。它被記錄爲Marco Kernel.<>/2。
忽略整個單詞作爲匹配是如此普遍,以至於有''all_but_first'選項。 ''[token] = Regex.run(〜r/Bearer \ s *(。*)/,header_content,capture::all_but_first)' – tkowal
我會達到'String.split/1' - '[_,token] = String.split(header_content)''但我很想知道那些更有知識的人的意見。 – peter
我同意 - 在Elixir中使用模式匹配幾乎總是比其他任何選項更具慣用性。 –