2016-06-10 57 views
1

我有這樣的嵌套列表項,地道藥劑獲取嵌套列表項目?

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

,我只需要獲得「xxxyyyxxxx123」值。

我現在正在這樣做,但我不認爲它是慣用的。

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

回答

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" 
+4

忽略整個單詞作爲匹配是如此普遍,以至於有''all_but_first'選項。 ''[token] = Regex.run(〜r/Bearer \ s *(。*)/,header_content,capture::all_but_first)' – tkowal

+0

我會達到'String.split/1' - '[_,token] = String.split(header_content)''但我很想知道那些更有知識的人的意見。 – peter

+0

我同意 - 在Elixir中使用模式匹配幾乎總是比其他任何選項更具慣用性。 –

1

如果只是字符串匹配"Bearer xxxyyyxxxx123",還有另一個慣用藥劑的方式來做到這一點。

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

請注意,您可以匹配這樣只有第一部分是文字二進制。它被記錄爲Marco Kernel.<>/2