【问题标题】:How to make a string 1st letter caps, 2nd letter noncaps, 3rd letter caps, 4th letter noncaps...?如何制作字符串第一个字母大写,第二个字母非大写,第三个字母大写,第四个字母非大写......?
【发布时间】:2016-07-02 17:30:08
【问题描述】:

我想改变:

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!"

【问题讨论】:

  • 我在您的代码中发现了一些错误: 1. 您想将word 字符串中的一些字符转换为大写字符,但您从未在脚本中调用String#upcase 方法。 2. 您只是将要修改的字符添加到result 变量中,但您忘记添加不需要修改的字符。 3. 在odd.each {|i| even.each {|b| result += word[b].to_s}} 行中,您正在执行odd * even 迭代。请记住,word变量的长度为odd + even。希望这可以帮助您找到解决方案!

标签: ruby string


【解决方案1】:
"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!"

【讨论】:

  • 太棒了!谢谢! @sawa
【解决方案2】:

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

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 包含大小写字母的混合,则这两种方法都有效。

【讨论】:

  • 我知道你会使用循环。
  • @sawa,我知道你知道并且会这么说,并且怀疑你知道我知道你知道。说到枚举器,我没有自制力。
【解决方案3】:

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

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!

【讨论】:

    【解决方案4】:

    试试这个:

    word.downcase.chars.map.with_index { |c,i| i%2==0 ? c.upcase : c }.join
    #=> "StAcKoVeRfLoW Is aWeSoMe!"
    

    【讨论】:

    • 你为什么要对整个字符串做downcase
    • @sawa 我这样做了,所以默认设置是小写的,这意味着我不必在三元运算符中处理它。例如,由于downcase 方法,目前我的代码适用于word = "STACKOVEFLOW IS awesome!"
    • 为什么会失败?这不是预期的吗? "STACKOVEFLOW IS awesome!".chars.map.with_index { |c,i| i%2==0 ? c.upcase : c.downcase }.join # => "StAcKoVeFlOw iS AwEsOmE!" 或者,您是否声称应用 downcase 一次比(可能)多次调用它更好?
    • 对不起,我觉得我误解了您的第一条评论,请忽略我在 cmets 中的示例。至于为什么我downcase整个字符串,就像我上面所说的那样-我没有这样的理由。但你的最后一个理论很有趣。
    • 这是一个下雨天,所以我跑了基准。我并不是说它更好,但是应用 downcase 一次更快:gist.github.com/awesome/6a2693f7dc7f917944ea1b08697149f2
    【解决方案5】:
    word = "Stackoverflow is awesome!"
    word.scan(/(.)(.)/).inject('') {|s,(x,y)| s << x.upcase << y.downcase}
    # => "StAcKoVeRfLoW Is aWeSoMe"
    

    更新

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

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

    【讨论】:

    • 为什么投反对票? “如果您认为这篇文章可以改进,请考虑添加评论。”
    猜你喜欢
    • 2013-09-01
    • 2017-03-30
    • 2018-07-08
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多