15

文字列があるとしましょう: "hEY"

「ねぇ」に変換したい

string.gsub!(/([a-z])([A-Z]+ )/, '\1'.upcase)

それは私が持っている考えですが、gsubメソッド内で使用する場合、upcaseメソッドは何もしないようです。何故ですか?

編集:私はこの方法を思いついた:

string.gsub!(/([a-z])([A-Z]+ )/) { |str| str.downcase!.capitalize! }

ただし、正規表現内でこれを行う方法はありますか?'\1''\2'のことはよくわかりません。それは逆参照ですか?それはどのように機能しますか

4

3 に答える 3

15

@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を使用して置換文字列を作成できます。

于 2013-03-26T02:25:24.027 に答える
10

なぜあなたがそれを複雑な方法でやろうとしているのか分かりませんが、通常の方法は次のとおりです。

"hEY".capitalize # => "Hey"

正規表現とを使用することを主張する場合はupcase、次も必要になりますdowncase

"hEY".downcase.sub(/\w/){$&.upcase} # => "Hey"
于 2013-03-26T00:48:08.453 に答える
7

文字列内のすべての文字の大文字と小文字を本当に入れ替えたい場合は、A Method ForThat™があるため、正規表現の複雑さを完全に回避できます。

"hEY".swapcase # => "Hey"
"HellO thERe".swapcase # => "hELLo THerE"

swapcase!破壊的にそれを行うこともあります。

于 2013-03-26T08:04:54.253 に答える