\ 1は何をしますか?
例えば
"foo bar bag".gsub(/(bar)/,'car\1')
かっこの使い方と関係があると思いますが、よくわかりません。誰かが私にそれを説明できますか?そして、あなたは\ 2のようなことをすることができますか?もしそうなら、それは何をしますか?
検索部分で括弧で囲んだ各項目は、置換部分の番号_\1
_、_\2
_などに対応します。
あなたの例では、括弧で囲まれた項目は"(bar)"
itemだけなので、_\1
_を置く場所は、括弧内の部分が入れ替わる場所です。 _\1
_を複数回繰り返します。これは、見つかったアイテムを繰り返したい場合に便利です。合法的に_car\1\1\1
_と書くことができ、_"bar"
_は3回交換されます。
_\2
_は、括弧で囲まれた項目が1つしかないため、使用できません。ただし、_(bar)(jar)
_がある場合、_\1
_は_"bar"
_を表し、_\2
_は_"jar"
_を表します。
次のようなこともできます。
_\1\2\1\2\2\1
_
これは次のようになります。
_barjarbarjarjarbar
_
これが役立つ実際の例を次に示します。次のような名前リストがあるとします。
_Jones, Tom
Smith, Alan
Smith, Dave
Wilson, Bud
_
そしてあなたはそれをこれに変更したい:
_Tom Jones
Alan Smith
Dave Smith
Bud Wilson
_
あなたは検索することができます:
_(.+), (.+)
_
と置き換えます:
_\2 \1
_
次のように置き換えることもできます。
_\1: \2 \1
_
どちらになるでしょう:
_Jones: Tom Jones
Smith: Alan Smith
Smith: Dave Smith
Wilson: Bud Wilson
_
一般的に、\N
は、正規表現で指定されたN番目のグループに置き換えられます。最初に一致したグループは\1
によって参照され、グループの最大数は9です。
いくつかの例:
# wrap every integer into brackets
'1 2 34'.gsub(/(\d+)/, '[\1]')
# => "[1] [2] [34]"
# gsub with two groups: swap couples of integers
'<1,2> <3,4>'.gsub(/(\d+),(\d+)/, '\2,\1')
# => "<2,1> <4,3>"
# you can reference the same group more than once
'1 2 34'.gsub(/(\d+)/, '<\1,\1>')
# => "<1,1> <2,2> <34,34>"
# a slightly more complex example
'Jim Morrison'.sub(/([A-Z])[a-z]+ ([A-Z][a-z]+)/, '\2 \1.')
# => "Morrison J."
\1
は、あなたが言ったように()
を使用した正規表現の最後のキャプチャの構文です。一致したものは何でも、それと置き換えてください。
()
グループとそれぞれの\2
を継続的に使用して、一致したものを引き続き置き換えることができます。