2014-04-07 115 views
1

有沒有辦法將字符串中的單詞小寫只有它們是不是全部大寫?小寫字母只有當它不是全部大寫?

例如字符串:

WOrd ABC Word wOrD WOrD

應返回:

Word ABC word word word

注:的第一個詞應該仍然得到 「句首字母大寫」。

我試過humanizetitlecase在rails中的函數,但它們也是全部大寫的小寫單詞(它通常代表某個首字母縮略詞,不應該小寫)。

更新:

與下面的答案的幫助下,這最終解決這個對我來說:

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」'returns' =>「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"