2014-04-07 3 views
1

Есть ли способ для строчных слов в строке только это они не во всех кепках?В нижнем регистре слово, только если это не все шапки?

Например, эта строка:

WOrd ABC Word wOrD WOrD

Если вернуться:

Word ABC word word word

Примечание: Первое слово должно еще получить "приговор дела".

Я пробовал функции humanize и titlecase в рельсах, но они также являются строчными словами, которые являются всеми шапками (которые часто представляют собой некоторый акроним и не должны опускаться ниже).

Update:

С помощью приведенных ниже ответов, это в конечном итоге решить это для меня:

def fix(string) 
    s = [] 
    string.split.each do |word| 
    if word.swapcase != word.downcase 
     s << word.downcase 
    else 
     s << word 
    end 
    end 
    s = s.join(' ').chomp(' ') 
    s[0] = s[0].capitalize 
    return s 
end 
+1

стоит ждать, пока у вас достаточно репутации, чтобы ответить на ваш собственный вопрос и затем отправляйте свое обновление в качестве ответа, а не включайте ответ в вопрос. – Shadwell

+0

Спасибо. Я вернусь и обновлю эту тему. – user3188544

ответ

2

Вы, вероятно, просто проверить, если swapcase и нижний регистр идентичны

if word.swapcase != word.downcase 
    s << word.downcase + " " 
else 
    s << word + " " 
1

Как насчет:

string = 'WOrd ABC Word wOrD WOrD' 
string.split(' ').map.with_index {|w,i| 
    /^[A-Z]+$/.match(w) ? w : i == 0 ? w.capitalize : w.downcase 
}.join(' ') 

Производит:

=> "Word ABC word word word" 
+0

Это не удается, если в строке есть только одно слово. Пример: 'WorD' – user3188544

+0

Любопытный. Он отлично работает для меня одним словом в строке. 'string =" WorD "' возвращает '=>" Word "' – Shadwell

+0

Вы правы. Я допустил ошибку при назначении строки var. Была распечатка другой строки. – user3188544

0

Я предпочитаю создавать небольшие методы, которые обеспечивают удобочитаемый имя:

class String 
    def all_caps? 
    swapcase == downcase 
    end 

    def downcase_all_but_acronyms 
    all_caps? ? self : downcase 
    end 
end 

Тогда ваш ответ:

string.split.map(&:downcase_all_but_acronyms) 
1
str = 'WOrd ABC Word wOrD WOrD' 

str.split.collect { |w| w.eql?(w.upcase) ? w : w.downcase }.join(' ').capitalize 

=> "Word abc word word word" 
Смежные вопросы