我需要为字符串中的每个单词大写每个“第n个”字符(在此示例中,第4个字符的倍数,因此字符4、8、12等)。
我想出了下面的代码(我知道不是很优雅!),但是它仅适用于length < 8
的单词。
'capitalize every fourth character in this string'.split(' ').map do |word|
word.split('').map.with_index do |l,idx|
idx % 3 == 0 && idx > 0 ? word[idx].upcase : l
end
.join('')
end
.flatten.join(' ')
任何人都可以告诉我如何将长度大于8的单词中的第4个字符大写吗?
谢谢!
答案 0 :(得分:4)
作为选择,您可以仅通过按索引访问字符来修改字符串中的第n个字符(如果存在)。
'capitalizinga every fourth character in this string'.split(' ').map do |word|
(3..word.length).step(4) do |x|
c = word[x]
word[x] = c.upcase if c
end
word
end.join(' ')
# capItalIzinGa eveRy fouRth chaRactEr in thiS strIng
这里使用的是方法step或Range
类,因此可以计算每个第四个索引:3、7、11等...
答案 1 :(得分:4)
str = 'capitalize every fourth character in this string'
idx = 0
str.gsub(/./) do |c|
case c
when ' '
idx = 0
c
else
idx += 1
(idx % 4).zero? ? c.upcase : c
end
end
#=> "capItalIze eveRy fouRth chaRactEr in thiS strIng"
答案 2 :(得分:3)
我认为最简单的方法是使用带有替换的正则表达式:
'capitalize every fourth character in this string'
.gsub(/([\w]{3})(\w)|([\w]{1,3})/) {
"#{$1}#{$2.to_s.upcase}#{$3}"
}
# => capItalIze eveRy fouRth chaRactEr in thiS strIng
这会使用2个带有捕获组的替代方案-第一个替代方案匹配4个字符,第二个替代方案匹配1-3个字符。 $1
组将完全匹配三个字母,而$2
组将匹配四个字母的第四个字母-而$3
组将匹配较长单词的剩余部分以及短于4个字符的单词。
然后,可以用$2
全局替换组gsub
。另外,如果$2.to_s
为$2
,则需要执行nil
(或使用三元运算符捕获该情况)。
答案 3 :(得分:1)
> str.split(" ").map{|word|
word.chars.each_with_index{|c,i|
c.upcase! if (i > 0 && (i+1)%4 == 0)}.join}.join(" ")
#=> "capItalIze eveRy fouRth chaRactEr in thiS strIng"