Заменить слово заглавными - PullRequest
1 голос
/ 25 января 2012

Если все первые слова строки (одно или несколько) в CAP, я хотел бы заменить эти слова на заглавные (используя ruby's .capitalize).Например, от «FOO BAR» до «Foo Bar»

я пробовал следующее:

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

и

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

, которые оба не работали.Есть ли способ сделать это?

Ответы [ 3 ]

5 голосов
/ 25 января 2012

Попробуйте:

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

В IRB:

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

или версия ОП:

'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 для фиксированной строки ничего полезного не даст.


В ОП добавлены дополнительные ограничения:

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" 
2 голосов
/ 25 января 2012

Вы хотите использовать все слова в строке, верно?Попробуйте вместо String # scan:

line.scan(/\w+|\W+/).map(&:capitalize).join
0 голосов
/ 25 января 2012

Я не программист на Ruby, но я вижу, что вы вызываете capitalize в строке \1, что, конечно, снова просто \1. Вы захотите поискать что-то похожее на PHP preg_replace_callback, которое позволит вам запускать регулярные выражения через функцию - в данном случае capitalize.

...