@sawa簡単な答えがあり、別のメカニズムで質問を編集しました。ただし、2つの質問に答えるには:
ただし、正規表現内でこれを行う方法はありますか?
いいえ、Rubyの正規表現は他の正規表現フレーバーのように大文字と小文字を変更する機能をサポートしていません。1.9および2.0の公式Ruby正規表現ドキュメントを確認し、「case」という単語を検索することで、これを自分自身に「証明」できます。
'\1''\2'のことはよくわかりません。それは逆参照ですか?それはどのように機能しますか?
の使用は\1
一種の後方参照です。\1
後方参照は、検索パターンでなどを使用する場合に使用できます。たとえば、正規表現では、文字、任意/f(.)\1/
の文字、同じ文字(たとえば、「foo」または「f !!」)が検索されます。f
この場合、のようなメソッドに渡される置換文字列内でString#gsub
、後方参照は前のキャプチャを参照します。ドキュメントから:
「置換が文字列の場合、一致したテキストに置き換えられます。これ\d
には、d
グループ番号、またはグループ名の形式のパターンのキャプチャグループへのバックリファレンスが含まれる場合があります。ダブルの場合-引用符で囲まれた文字列の場合、両方の後方参照の前に追加の円記号を付ける必要があります。」\k<n>
n
実際には、これは次のことを意味します。
"hello world".gsub( /([aeiou])/, '_\1_' ) #=> "h_e_ll_o_ w_o_rld"
"hello world".gsub( /([aeiou])/, "_\1_" ) #=> "h_\u0001_ll_\u0001_ w_\u0001_rld"
"hello world".gsub( /([aeiou])/, "_\\1_" ) #=> "h_e_ll_o_ w_o_rld"
ここで、コードがいつ実行されるかを理解する必要があります。元のコードでは…</p>
string.gsub!(/([a-z])([A-Z]+ )/, '\1'.upcase)
…実行しているのはupcase
、文字列'\1'
(効果はありません)を呼び出してからgsub!
メソッドを呼び出し、正規表現と文字列をパラメーターとして渡すことです。
最後に、これと同じ目標を達成する別の方法は、次のようなブロック形式を使用することです。
# Take your pick of which you prefer:
string.gsub!(/([a-z])([A-Z]+ )/){ $1.upcase << $2.downcase }
string.gsub!(/([a-z])([A-Z]+ )/){ [$1.upcase,$2.downcase].join }
string.gsub!(/([a-z])([A-Z]+ )/){ "#{$1.upcase}#{$2.downcase}" }
gsubのブロック形式では、キャプチャされたパターンはグローバル変数などに設定され、$1
それら$2
を使用して置換文字列を作成できます。