誰かがバックリファレンスがルビー正規表現でどのように正確に機能するかを説明できますか?特に、グループ化がどのように機能するかを正確に知りたいです(..)
。例えば:
s = /(..) [cs]\1/.match("The cat sat in the hat")
puts s
上記のコードスニペットの場合、出力は次のとおりat sat
です。なぜ/どのようにこの出力を取得するのですか?
この正規表現の意味は次のとおりです。
regex = /(..) [cs]\1/
# ├──┘ ├──┘├┘
# │ │ └─ A reference to whatever was in the first matching group.
# │ └─ A "character class" matching either "c" or "s".
# └─ A "matching group" referenced by "\1" containing any two characters.
正規表現を一致するグループと一致させた後、特別な変数$1
($2
、など)には一致したものが含まれることに注意してください。
/(..) [cs]\1/.match('The cat sat in the hat') # => #<MatchData...>
$1 # => "at"
このRegexp#match
メソッドはMatchDataオブジェクトを返すことにも注意してください。このオブジェクトには、一致全体( "at sat"、aka $&
)と、一致する各グループ( "at"、aka $1
)の原因となった文字列が含まれています。
/(..) [cs]\1/.match('The cat sat in the hat')
=> #<MatchData "at sat" 1:"at">
まず、の出力はputs s
キャプチャグループではありません。
s = /(..) [cs]\1/.match("The cat sat in the hat")
puts s
# at sat
キャプチャグループにアクセスする場合は、次を使用する必要がありますMatchData.captures
。
s = /(..) [cs]\1/.match("The cat sat in the hat")
s.captures
# => ["at"]