2014-02-19 4 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

Yep, 'capture:: all_but_first' работает как шарм. Но почему это называется 'all_but_first'? – diogovk

+2

Режим по умолчанию - ': all', который фиксирует весь матч плюс каждый захват (анонимный или именованный). ': all_but_first' исключает весь матч. –

Смежные вопросы