如果該單詞的第一個單詞(一個或多個)全部在CAP中,我想用大寫詞替換這些單詞(使用ruby的.capitalize
)。對於例如「FOO BAR」 到 「富酒吧」用大寫字替換單詞
我試過如下:
line.gsub!(/^([A-Z ]+)/, '\1'.capitalize)
和
line.gsub!(/^([A-Z ]+)/, "\\1".capitalize)
這兩人都沒有工作。有沒有辦法做到這一點?
如果該單詞的第一個單詞(一個或多個)全部在CAP中,我想用大寫詞替換這些單詞(使用ruby的.capitalize
)。對於例如「FOO BAR」 到 「富酒吧」用大寫字替換單詞
我試過如下:
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"
對於前兩個單詞,這是快速和骯髒的:
'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"
我不是紅寶石程序員,但我可以看到你在字符串\1
,當然這僅僅是\1
再次調用capitalize
。您將需要尋找類似於PHP的preg_replace_callback
的東西,這將允許您通過函數運行正則表達式匹配 - 在此例中爲capitalize
。
你想要大寫所有單詞,正確嗎? 嘗試字符串#掃描,而不是:
line.scan(/\w+|\W+/).map(&:capitalize).join
這適用,但只適用於第一個全部大寫字。你知道如何使它適用於前兩個單詞全部大寫的情況嗎? – zanbri
只需要在[]中添加空格字符。他在他的例子中忘了(?)。 – oldergod
我嘗試了這個空間,它仍然不適用於第二個全部字的單詞。 – zanbri