Regex - сохранение повторяющейся захваченной группы - PullRequest
5 голосов
/ 06 сентября 2010

Это то, что я делаю

a = "%span.rockets#diamonds.ribbons.forever"
a = a.match(/(^\%\w+)([\.|\#]\w+)+/)
puts a.inspect

Это то, что я получаю

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever">

Это то, что я хочу

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever">

помощь?Я попытался и потерпел неудачу: (

Ответы [ 2 ]

8 голосов
/ 06 сентября 2010

Как правило, вы не можете получить произвольное количество групп захвата, но если вы используете 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

3 голосов
/ 06 сентября 2010

Вот как работают группы захвата.Если вы хотите сохранить все эти подстроки, поместите квантификатор в группу захвата:

a = a.match(/(^%\w+)((?:[.#]\w+)+)/)

Тогда ваш второй захват будет:

2:".rockets#diamonds.ribbons.forever"

.... и ты можешь сломать это до конца.

...