Как правило, вы не можете получить произвольное количество групп захвата, но если вы используете scan
, вы можете получить совпадение для каждого токена, который хотите захватить:
a = "%span.rockets#diamonds.ribbons.forever"
a = a.scan(/^%\w+|\G[.|#]\w+/)
puts a.inspect
["%span", ".rockets", "#diamonds", ".ribbons", ".forever"]
Это не слишком отличается от вашего регулярного выражения, но я убрал повторение на последнем токене. \G
не слишком известен - он сообщает движку о совпадении, где закончилось предыдущее совпадение, поэтому он не прерывается, когда между совпадениями появляются дополнительные символы (%span :P .rockets
).
Как правило, если у вас было несколько совпадений с исходным регулярным выражением, этот метод может добавить некоторую работу, потому что у вас нет групп, разделенных на совпадения, но, поскольку match
возвращает один результат, он должен работать нормально.
Рабочий пример: http://ideone.com/nnmki