1

行の最初の単語(1つ以上)がすべてCAP内にある場合、それらの単語を大文字の単語に置き換えます(ruby'sを使用.capitalize)。たとえば、「FOOBAR」から「FooBar」へ

私は次のことを試しました:

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

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

どちらも機能しませんでした。これを行う方法はありますか?

4

3 に答える 3

5

試す:

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" 
于 2012-01-25T04:50:37.587 に答える
2

行内のすべての単語を大文字にしたいですよね?代わりに String#scan を試してください:

line.scan(/\w+|\W+/).map(&:capitalize).join
于 2012-01-25T05:27:19.607 に答える
-1

私は Ruby プログラマーではありませんが、あなたがcapitalizestring を呼び出していることはわかります。\1もちろん、これもまた同じ\1です。preg_replace_callback関数を介して正規表現一致を実行できるPHP に似たものを探す必要があります。この場合はcapitalize.

于 2012-01-25T04:50:47.957 に答える