我被要求编写一些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; 到缺少切片的最后一个字母的单词。最后,一系列单词现在加入和''一起改写句子。
答案 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
但是,它会降低所有其他字母......