2010-06-09 19 views
2

我面臨的挑戰是寫一些Ruby代碼,改變每個字的最後一個字符在句子變成資本的資本。這樣的字符串:在一個句子中每個單詞的最後一個字符改爲使用Ruby

"script to convert the last letter of every word to a capital" 

成爲

"scripT tO converT thE lasT letteR oF everY worD tO A capitaL" 

這是我最終使用:

"script to convert the last letter of every word to a capital".split.map{|w|w<<w.slice!(-1).chr.upcase}.join' ' 

對於那些有興趣,什麼是怎麼回事是一個解釋。

拆分會將句子拆分成數組,默認分隔符是空格,使用Ruby您不需要在這裏使用括號。

map將來自split的數組傳遞給映射,該映射將打開一個塊並處理數組中的每個單詞(w)。塊切片!(S)斷字的最後一個字符,並將其轉換爲CHR(字符不是ASCII碼),然後大寫upcase它。此字符現在追加< <到缺少切片最後一個字母的單詞。最後字的排列是現在「」加入一起改革的句子。

+0

如果有標點符號在句子這是行不通的。這是一個要求嗎? – mckeed 2010-06-09 16:12:20

回答

8

這裏有一個快速和骯髒的正則表達式的方法,這是肯定的方式被打破我還沒有考慮:

"the quick brown fox jumps over the lazy dog".gsub(/.\b/) { |m| m.upcase } 

即upcase單詞邊界之前的最後一個字符匹配。

+0

這實際上比原始文字更好,因爲它對於非空格單詞邊界不會失敗。 – molf 2010-06-09 16:09:41

+1

我可以用這個找到的唯一的問題是單詞間的標點符號,就像在收縮撇號(如「不」)。 – mckeed 2010-06-09 16:13:46

+0

@ mckeed良好的通話。我知道有些東西不見了。 – x1a4 2010-06-09 16:21:47

2

我企圖在覆蓋用正則表達式所有的標點問題:

str = %("But we're street-smart," she said.) 

str.gsub(/\w\W*(\s|$)/) {|m| m.upcase } 
1
str.reverse.split(/\b/).map(&:capitalize).join.reverse 

然而,downcases所有其他字母...

4

隨着軌道titleize方法,你可以:

str.reverse.titleize.reverse 
+0

輝煌! (我想這是原始問題的意圖) – 2010-06-10 03:40:46

+0

很酷我試圖想到一種使用反向的方式,羞愧地說titleize不是Ruby命令......但是反正沒有任何規則。 – emson 2010-06-10 11:42:24

2

好吧,我不知道Ruby,但這裏是企圖在其表弟(蟒蛇),它是甚至有點短:

' '.join(w[:-1]+w[-1].upper()for w in 
"script to convert the last letter of every word to a capital".split()) 

但隨着反titleize反向的辦法是實打實的:

"script to convert the last letter of every word to a capital"[::-1].title()[::-1] 
+0

非常喜歡你的想法。 – emson 2010-06-11 09:54:24

相關問題