Это снимки с самого последнего совпадения с образцом (так же, как в Perl; Ruby первоначально снял много синтаксиса с Perl, хотя к настоящему времени он уже преодолен :)).$1
, $2
и т. Д. Относятся к заключенным в скобки захватам в регулярном выражении: учитывая, что /a(.)b(.)c/
, $1
будет символом между a
и b
и $2
символом между b
и c
.$`
и $'
означают строки до и после строки, которая соответствует всему регулярному выражению (которое само находится в $&
), соответственно.
На самом деле в этом есть некоторый смысл, хотя бы исторически;вы можете найти его в perldoc perlvar
, который обычно хорошо документирует предполагаемую мнемонику и историю переменных Perl, и в основном все еще применяется к глобальным переменным в Ruby.Пронумерованные захваты являются заменой синтаксиса регулярных выражений обратного захвата (\1
, \2
и т. Д.);Perl переключился с первого на второе где-то в версиях 3.x, потому что использование синтаксиса обратных ссылок вне регулярного выражения слишком усложняло синтаксический анализ.(К тому времени, когда Perl 5 развернулся, синтаксический анализатор был достаточно переписан, чтобы синтаксис снова был доступен, и быстро повторно использовался для ссылок / «указателей». Ruby выбрал вместо этого кавычку :
, которая ближе кСтиль Lisp и Smalltalk: поскольку Ruby начинал как Perl-подобный с ОО в стиле Smalltalk, это более логично с точки зрения лингвистики.) То же самое относится к $&
, который в историческом синтаксисе регулярных выражений просто &
(но вы можете 't использовать его вне замещающей части замещения, чтобы вместо этого она стала переменной $&
).$`
и $'
оба являются "cutesy": "обратная кавычка" и "прямая кавычка" из соответствующей строки.