行の最初の単語(1つ以上)がすべてCAP内にある場合、それらの単語を大文字の単語に置き換えます(ruby'sを使用.capitalize
)。たとえば、「FOOBAR」から「FooBar」へ
私は次のことを試しました:
line.gsub!(/^([A-Z ]+)/, '\1'.capitalize)
と
line.gsub!(/^([A-Z ]+)/, "\\1".capitalize)
どちらも機能しませんでした。これを行う方法はありますか?
試す:
line.gsub!(/^([A-Z ]+)/) { |w| w.capitalize }
IRB では:
require 'active_support'
'FOO bar'.gsub(/^[A-Z]+/) { |w| w.capitalize }
=> "Foo bar"
またはOPのバージョン:
'FOO bar'.gsub!(/^([A-Z ]+)/) { |w| w.capitalize }
=> "Foo bar"
最初の 2 つの単語については、これは簡単で汚いものです。
'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"
行内のすべての単語を大文字にしたいですよね?代わりに String#scan を試してください:
line.scan(/\w+|\W+/).map(&:capitalize).join
私は Ruby プログラマーではありませんが、あなたがcapitalize
string を呼び出していることはわかります。\1
もちろん、これもまた同じ\1
です。preg_replace_callback
関数を介して正規表現一致を実行できるPHP に似たものを探す必要があります。この場合はcapitalize
.