4

誰かがバックリファレンスがルビー正規表現でどのように正確に機能するかを説明できますか?特に、グループ化がどのように機能するかを正確に知りたいです(..)。例えば:

s = /(..) [cs]\1/.match("The cat sat in the hat")

puts s 

上記のコードスニペットの場合、出力は次のとおりat satです。なぜ/どのようにこの出力を取得するのですか?

4

2 に答える 2

18

この正規表現の意味は次のとおりです。

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"> 
于 2012-10-30T04:25:16.823 に答える
2

まず、の出力は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"]
于 2012-10-30T04:22:16.590 に答える