web-dev-qa-db-ja.com

Ruby正規表現\ 1はgsubにとって何を意味しますか

\ 1は何をしますか?

例えば

"foo bar bag".gsub(/(bar)/,'car\1')

かっこの使い方と関係があると思いますが、よくわかりません。誰かが私にそれを説明できますか?そして、あなたは\ 2のようなことをすることができますか?もしそうなら、それは何をしますか?

14
Tommy

検索部分で括弧で囲んだ各項目は、置換部分の番号_\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
_
24
James Toomey

一般的に、\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."
8
toro2k

\1は、あなたが言ったように()を使用した正規表現の最後のキャプチャの構文です。一致したものは何でも、それと置き換えてください。

()グループとそれぞれの\2を継続的に使用して、一致したものを引き続き置き換えることができます。

6
squiguy