2014-02-19 51 views
4

以下代碼返回集團是不是在所有我所料:掃描使用正則表達式

iex(12)> Regex.scan(%r/(?<groupname>a)b(c)/g,"abcdabcd", capture: :groups) 
[["a"], ["a"]] 

有2組,但只有一個名爲出現在結果。並且組名完全被忽略。

如果我使用named_capture,我得到如下:

iex(14)> Regex.named_captures(%r/(?<groupname>a)b(c)/g,"abcdabcd", capture: :groups) 
[groupname: "a"] 

嗯,我想的

Regex.scan(%r/(?<groupname>a)b(c)/g,"abcdabcd", capture: :groups) 

的結果應該是

[["a", "c"], ["a", "c"]] #=> including "anonymous groups" 

[[groupname: "a"], [groupname: "a"]] #=> include group name in the results 

所以我的問題是爲什麼當使用Regex.scan時,爲什麼必須在組捕獲中命名組,以便它們完全被忽略?

回答

4

它發生名稱:groups是誤導。這並不意味着所有的團體,而只是所有的團體。這就是爲什麼we are renaming :groups to :named in upcoming releases。你可以通過使用capture: :all_but_first來獲得你想要的行爲。我將很快記錄這個選項。

+0

是的,'捕獲:: all_but_first'就像一個魅力。但爲什麼它被稱爲'all_but_first'? – diogovk

+2

默認模式是':all',它捕獲整個匹配加上每個捕獲(匿名或命名)。 ':all_but_first'不包括整個比賽。 –

相關問題