2016-06-10 2 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" 

사용하는 것 다른 정규식 패턴 매칭 : 그냥 문자열 "Bearer xxxyyyxxxx123"에 맞게 있다면

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

전체 단어를 일치로 무시하는 것은 매우 일반적이어서 'all_but_first'옵션이 있습니다. – tkowal

+0

'String.split/1'에 도달 할 것입니다. - [[_, token] = '(토큰) = Regex.run (~ r/Bearer \ s * (. *)/header_content, capture : : all_but_first) String.split (header_content)'라고 말하면서 더 지식이 많은 사람들의 의견을 알고 싶습니다. – peter

+0

나는 동의한다 - Elixir에서 패턴 매칭을 사용하는 것은 거의 언제나 다른 옵션보다 훨씬 더 관용적이다. –

1

는 그것을 할 또 다른 관용적 비약의 방법이있다. 첫 번째 부분은 문자 그대로 바이너리 경우에만이 처럼 일치시킬 수 있습니다

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

참고. Marco Kernel.<>/2으로 기록되었습니다.

관련 문제