Как получить 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 { $~ }