2012-01-25 20 views
1

行の最初の単語(1つ以上)がすべてCAPである場合、それらの単語を大文字の単語(ルビーの.capitalizeを使用)に置き換えます。例えば、 "フーバー" へ単語を大文字の単語に置き換えます

"FOOのBARは、" 私は次のことを試してみました:

line.gsub!(/^([A-Z ]+)/, '\1'.capitalize) 

の両方が動作しませんでした
line.gsub!(/^([A-Z ]+)/, "\\1".capitalize) 

。これを行う方法はありますか?

答えて

5

試してみてください。IRBで

line.gsub!(/^([A-Z ]+)/) { |w| w.capitalize } 

require 'active_support' 
'FOO bar'.gsub(/^[A-Z]+/) { |w| w.capitalize } 
=> "Foo bar" 

またはOPのバージョン:最初の二つの言葉のために

'FOO bar'.gsub!(/^([A-Z ]+)/) { |w| w.capitalize } 
=> "Foo bar" 

、これは迅速かつ汚いです:

'FOO BAR'.gsub!(/^([A-Z ]+ [A-Z]+)/) { |w| w.capitalize } 
=> "Foo bar" 

あなたが使用して少しきれいを得ることができます:もちろん

'FOO BAR'.gsub!(/^((?<word>[A-Z]+) \g<word>)/) { |w| w.capitalize } 
=> "Foo bar" 

、便利な何もしません固定文字列にgsub!バージョンを使用します。


ザ・OPは追加の制約を追加しました:

require 'active_support' 

line = 'AFOO BFOO CFOO DFOO e f g' 
words = line[/^(?:[A-Z]+)+/].split.map{ |w| w.capitalize } # => ["Afoo", "Bfoo", "Cfoo", "Dfoo"] 
[words,line.split[words.size..-1]].join(' ')    # => "Afoo Bfoo Cfoo Dfoo e f g" 
+0

これは機能しますが、最初の全角文字のみで動作します。最初の2つの単語がすべて大文字である場合に、それを動作させる方法を知っていますか? – zanbri

+0

[]内に空白文字を追加するだけです。彼は彼の例でそれを忘れてしまった。 – oldergod

+0

私もスペースで試しましたが、それはまだ2番目のすべてのキャップの単語のために動作しません。 – zanbri

-1

私はRubyのプログラマだありませんが、私はあなたが、もちろん再びちょうど\1ある文字列\1、上capitalizeを呼び出していることがわかります。正規表現を関数(この場合はcapitalize)で実行できるPHPのpreg_replace_callbackに似たものを探したいでしょう。

2

すべての単語を大文字にしたいですか? 代わりに文字列スキャンを試してください:

line.scan(/\w+|\W+/).map(&:capitalize).join 
関連する問題