如何制作字符串第一个字母大写、第二个字母非大写、第三个字母大写和第四个字母非小写.



我想更改:

word = "Stackoverflow is awesome!"

进入:

"StAcKoVeRfLoW Is aWeSoMe!"

我做到了:

result = ""
a = word.length
odd = (1..a).select(&:odd?)
even = (1..a).select(&:even?)
odd.each {|i| even.each {|b| result += word[b].to_s}}
result # => "akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!"
"Stackoverflow is awesome!"
.gsub(/(.)(.)?/){$1.upcase + $2.to_s.downcase}
# => "StAcKoVeRfLoW Is aWeSoMe!"
"Stackoverflow is awesome!"
.gsub(/./).with_index{|s, i| i.even? ? s.upcase : s.downcase}
# => "StAcKoVeRfLoW Is aWeSoMe!"
"Stackoverflow is awesome!"
.gsub(/..?/, &:capitalize)
# => "StAcKoVeRfLoW Is aWeSoMe!"

这里还有几个方法没有提到。

text = "Stackoverflow is awesome!"
text.downcase.dup.tap { |t| (0...t.size).step(2) { |i| t[i] = t[i].upcase } }
  #=> "StAcKoVeRfLoW Is aWeSoMe!"
e = [:upcase, :downcase].cycle
"Stackoverflow is awesome!".gsub(/./) { |c| c.send e.next }
  #=> "StAcKoVeRfLoW Is aWeSoMe!"

如果text包含大小写字母的混合,则这两种方法都有效。

可能有更聪明的方法可以做到这一点,但我认为这是最清晰的方法之一:

text = "Stackoverflow is awesome!"
for i in 0...text.length do
  if i.even?
    text[i] = text[i].upcase
  else
    text[i] = text[i].downcase
  end
end
puts text
# Output:
# StAcKoVeRfLoW Is aWeSoMe!

试试这个:

word.downcase.chars.map.with_index { |c,i| i%2==0 ? c.upcase : c }.join
#=> "StAcKoVeRfLoW Is aWeSoMe!"
word = "Stackoverflow is awesome!"
word.scan(/(.)(.)/).inject('') {|s,(x,y)| s << x.upcase << y.downcase}
# => "StAcKoVeRfLoW Is aWeSoMe"
  • http://ruby-doc.org/core-2.3.1/String.html#method-i-scan
  • http://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-inject

更新

删除了对第二个正则表达式匹配的依赖,就像Sawa的回答一样。

word = "Stackoverflow is awesome!"
word.scan(/(.)(.)?/).inject('') {|s,(x,y)| s << x.upcase << y.to_s.downcase}

相关内容

最新更新