2012-01-25 95 views
1

如果該單詞的第一個單詞(一個或多個)全部在CAP中,我想用大寫詞替換這些單詞(使用ruby的.capitalize)。對於例如「FOO BAR」 到 「富酒吧」用大寫字替換單詞

我試過如下:

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

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

這兩人都沒有工作。有沒有辦法做到這一點?

回答

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" 

對於前兩個單詞,這是快速和骯髒的:

'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

這適用,但只適用於第一個全部大寫字。你知道如何使它適用於前兩個單詞全部大寫的情況嗎? – zanbri

+0

只需要在[]中添加空格字符。他在他的例子中忘了(?)。 – oldergod

+0

我嘗試了這個空間,它仍然不適用於第二個全部字的單詞。 – zanbri

-1

我不是紅寶石程序員,但我可以看到你在字符串\1,當然這僅僅是\1再次調用capitalize。您將需要尋找類似於PHP的preg_replace_callback的東西,這將允許您通過函數運行正則表達式匹配 - 在此例中爲capitalize

2

你想要大寫所有單詞,正確嗎? 嘗試字符串#掃描,而不是:

line.scan(/\w+|\W+/).map(&:capitalize).join