2016-06-10 4 views

Antwort

4

Die idiomatische Weise, während den gleichen Regex.scan/2 Anruf zu halten, ist Musteranpassung zu verwenden.

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

Es sei denn, ich bin etwas fehlt, eine idiomatische Weise (und wahrscheinlich effizienter) diese Zeichenfolge übereinstimmen (es ist nicht Funktionalität entspricht Ihrer bisherigen regex, aber dies könnte für Sie richtig sein) wäre zu verwenden eine andere Regex und pattern-Matching:

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

Das ganze Wort als Übereinstimmung zu ignorieren ist so üblich, dass es eine Option für das ': all_but_first' gibt. '[token] = Regex.run (~ r/Bearer \ s * (. *) /, header_content, capture:: all_but_first)' – tkowal

+0

Ich würde nach 'String.split/1' -' [_, token] = erreichen String.split (header_content) 'aber ich wäre daran interessiert, die Meinungen der Kenner zu kennen. – peter

+0

Ich stimme zu - die Verwendung von Pattern-Matching in Elixir ist fast immer viel idiomatischer als jede andere Option. –

1

Wenn es nur um die Zeichenfolge zu entsprechen "Bearer xxxyyyxxxx123", gibt es eine andere idiomatische Elixir Art und Weise, es zu tun.

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

Beachten Sie, dass Sie dieses nur mithalten können, wenn der erste Teil eine wörtliche binäre ist. Es wurde als Marco Kernel.<>/2 dokumentiert.

Verwandte Themen