丸括弧 ( ) によってキャプチャをすることができます。 括弧に囲まれた部分正規表現にマッチした 前からn番目の開き括弧によって囲まれた部分式にマッチした 文字列を後で参照することができます。
正規表現内では \1, \2, ... という記法で後方参照できます。 また、\k<1>, \k<2>, ... や \k'1', \k'2', ... という記法を使うこと もできます(10を越える数字を渡すことができます)。 また、Regexp#match で得られた MatchData からは MatchData#[ ]で取り出せます。
また、$1, $2, ... という特殊変数によって n 番目の括弧にマッチした 部分文字列を参照できます。これらの特殊変数はマッチ処理が終わったあとで しか使えないことに注意してください。
# (..) に at がマッチしたのを \1 で参照し、マッチが成功している。
m = /csh [csh]\1 in/.match("The cat sat in the hat")
# => #< MatchData "cat sat in" 1:"at">
# Regexp#match でマッチしたテキストは MatchData#[] で参照できる
m[1] # => "at"
1,2,... ではなく、名前を付けることができます。 (?< name>pat)もしくは(?'name'pat)と記述します。キャプチャした文字列は MatchData#[ ] に Symbol を渡すことで参照できます。 これは名前付きキャプチャと呼ばれます。
m = /$(?\d+).(?< cents>\d+)/.match("$3.67")
=> #< MatchData "$3.67" dollars:"3" cents:"67">
m[:dollars] # => "3"
m[:cents] # => "67"
名前付きキャプチャは正規表現内で \k、\k'name' という記法で参照できます。
/(?< vowel>[aeiou]).\k< vowel>.\k< vowel>/.match('ototomy')
=> #< MatchData "ototo" vowel:"o">
注: 名前付きキャプチャと数字によるキャプチャは併用できません。
リテラル正規表現内に名前付きキャプチャがあり、 =~ の左辺で用いた 場合には、その名前のローカル変数にキャプチャした文字列を代入します。
/$(?< dollars>\d+)\.(?< cents>\d+)/ =~ "$3.67" # => 0
dollars # => "3"
cents # => "67"
注: ローカル変数への代入が行われるのは、左辺の正規表現リテラルが#{}による式展開を含んでいない場合に限られます。
数字による後方参照では、負の数による、 \k<-1>, \k<-2>, ... や \k'-1', \k'-2', ... という記法での 相対的な指定が可能です。-1 は後方参照が書かれた位置の1つ手前の 位置にあるキャプチャを表し、-2, -3, で2つ手前、3つ手前を表します。 これは非常に多くのキャプチャを持つような正規表現を記述するためや、 正規表現に別の正規表現を式展開で埋め込む場合などに便利です。
/(.)(.)\k<-2>\k<-1>/.match("xyzyz") # => #< MatchData "yzyz" 1:"y" 2:"z">