2016-09-07 3 views
0

У меня есть регулярное выражение в моем рубиновом скрипте с несколькими группами захвата. Вот его фрагмент: /^cost:\s(\d)+\sitems:\s И я фиксирую цифру, которая поступает сразу после стоимости. У меня больше групп захвата позже, но я не знаю, сколько будет захвачено. Зависит от входного текстового файла. Я знаю, что способ доступа к группам захвата:Группы захвата графа ruby ​​

$1, $2 etc etc 

Но я не знаю, сколько из них захвачено. Есть ли способ узнать количество захваченных групп и, возможно, перебрать их?

Благодаря

ответ

3

Можно использовать MatchData#captures:

▶ mtch = /(\w)(\w)(\w)/.match 'hello' 
#⇒ #<MatchData "hel" 1:"h" 2:"e" 3:"l"> 
▶ mtch.captures 
#⇒ [ 
# [0] "h", 
# [1] "e", 
# [2] "l" 
# ] 

Кроме того, обратите внимание, что вы на самом деле захватить первую цифру только последовательности. Для того, чтобы захватить все, переместить + внутри круглых скобок:

#   ⇓ 
/^cost:\s(\d+)\sitems:\s.../ 
+0

Спасибо! Вопрос: Я попытался выполнить итерацию через mtch.each {| x | помещает x}, но попал в ошибку .each, не определенную. Почему это? Является ли цикл for единственным способом его повторения? –

+0

Вы, должно быть, шутите: 'mtch.captures.each {| e | print e} # ⇒ hel'. Сбой в другом месте. – mudasobwa

+0

О, я тупой. Не делал захватов. -_- –

0

Рассмотрите возможность использования метода сканирования, если вы думаете, что есть недетерминированное раскол с регулярным выражением: http://ruby-doc.org/core-2.2.0/String.html#method-i-scan

+0

Что такое «недетерминированный раскол»? –

+0

Плохая формулировка, возможно. Я имею в виду, что я использую объект Rubge's Regex, когда мне нужно сопоставить то, что имеет известное количество групп захвата. Но когда я хочу сопоставить список вещей, где я не знаю, сколько у меня элементов, то я использую Scan. –

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