Что делает амперсанд в приведенном ниже коде?

s.reverse.gsub( /\d{3}(?=\d)/, '\&,' ).reverse

После попытки найти такие вещи можно было бы подумать, что это специальная переменная, означающая post_match или pre_match, но в документации ничего не говорится об амперсандах - только знаки доллара, за которыми следует или перед ними стоит галочка.

0
dwilbank 27 Дек 2013 в 20:52
2
 – 
Aleksei Matiushkin
27 Дек 2013 в 21:00
Так вот оно! Я был на ruby-doc.org/core-2.1.0/ MatchData.html - Спасибо
 – 
dwilbank
27 Дек 2013 в 21:19

1 ответ

Лучший ответ

\& определяет всю строку, которой соответствует регулярное выражение. см. этот упрощенный пример:

s = "p1:1 1:1";
print s.gsub( /[a-z]/, '[\&],' ) ## only p is matched

Вывод: [p],1:1 1:1

Точно так же \1 определяет первую группу, совпадающую с регулярным выражением. (Аналогично для \ 2, \ 3 ... и так далее). Пример:

s = "p1:1 1:1";
print s.gsub( /(\d:\d)/, '[\1]' )

Вывод: p[1:1] [1:1]

1
Sabuj Hassan 27 Дек 2013 в 21:22
Поэтому круглые скобки в моем примере не захватывают ... а амперсанд предназначен для случаев, когда вам нужна только одна реальная группа захвата, и вам не хочется заключать их в круглые скобки ...?
 – 
dwilbank
27 Дек 2013 в 21:31
Так это точный эквивалент, не так ли? s.reverse.gsub (/ (\ d {3}) (? = \ d) /, '\ 1,') .reverse
 – 
dwilbank
27 Дек 2013 в 21:32