Как получить Match Group в Ruby как Rubular, не разбивая строку

Как Rubular ( Пример) получает группы совпадений?

/regex(?<named> .*)/.match('some long string')

Метод match (в примере) возвращает только первое совпадение.

Метод сканирования возвращает массив без именованных захватов.

Каков наилучший способ получить массив именованных захватов (без разделения)?

1 ответ

Решение

Я всегда предполагал, что Rubular работает примерно так:

matches = []

"foobar foobaz fooqux".scan(/foo(?<named>\w+)/) do
  matches << Regexp.last_match
end

p matches
# => [ #<MatchData "foobar" named:"bar">,
#      #<MatchData "foobaz" named:"baz">,
#      #<MatchData "fooqux" named:"qux"> ]

Если мы используем enum_for а также $~ (псевдоним для Regexp.last_match) мы можем сделать это немного более Rubyish:

matches = "foobar foobaz fooqux".enum_for(:scan, /foo(?<named>\w+)/).map { $~ }
Другие вопросы по тегам