使用Ruby将句子中每个单词的最后一个字符更改为大写字母

时间:2010-06-09 15:54:00

标签: 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中的数组传递给map,该地图打开一个块并处理数组中的每个单词(w)。块切片!(s)离开单词的最后一个字符并将其转换为 chr (字符不是ASCII代码),然后将 upcase大写它。此字符现在附加&lt;&lt; 到缺少切片的最后一个字母的单词。最后,一系列单词现在加入''一起改写句子。

5 个答案:

答案 0 :(得分:8)

这是一个快速而肮脏的正则表达式方法,肯定会以我未考虑的方式被打破:

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

即。在字边界之前填写最后一个字符匹配。

答案 1 :(得分:4)

使用rails titleize方法,您可以:

str.reverse.titleize.reverse

答案 2 :(得分:2)

我试图用正则表达式覆盖所有标点符号问题:

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

str.gsub(/\w\W*(\s|$)/) {|m| m.upcase }

答案 3 :(得分:2)

嗯,我不知道Ruby,但这里是它的堂兄(Python)的尝试,它甚至更短一些:

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

但反向标题反转的方法才是真正的优点:

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

答案 4 :(得分:1)

str.reverse.split(/\b/).map(&:capitalize).join.reverse

但是,它会降低所有其他字母......