【问题标题】:simpler way to modify a string修改字符串的更简单方法
【发布时间】:2021-08-14 15:58:35
【问题描述】:

我最近解决了这个问题,但觉得有一种更简单的方法可以解决。我想使用比现在更少的代码行。我是 ruby​​ 的新手,所以如果答案很简单,我很乐意将它添加到我的工具包中。提前谢谢你。

目标:接受一个单词作为 arg,并返回去掉最后一个元音的单词,如果没有元音 - 返回原始单词

def hipsterfy(word)
    vowels = "aeiou"
    i = word.length - 1
    while i >= 0
        if vowels.include?(word[i])
            return word[0...i] + word[i+1..-1]
        end
        i -= 1
    end
    word
end

【问题讨论】:

  • 一切都在一个 sub 中,没有反转,也没有测试:word.sub(/[aeiou](?!.*?[aeiou])/, "")

标签: ruby-on-rails ruby rspec


【解决方案1】:

试试这个正则表达式魔法:

def hipsterfy(word)
  word.gsub(/[aeiou](?=[^aeiou]*$)/, "")
end

它是如何工作的?

[aeiou] 查找元音。?=[^aeiou]*$ 添加约束“在以下字符串中没有元音匹配的地方。所以正则表达式找到最后一个元音。然后我们只需 gsub 匹配的(最后一个元音) “”。

【讨论】:

  • 或者,使用/[aeiou](?!.*[aeiou])/。使用sub 可能比使用gsub 更清晰。
  • word[/.../] = '',因为它最多只能替换一个。
【解决方案2】:

您可以使用rindex 查找最后一个元音的索引,并使用[]= 删除相应的字符:

def hipsterfy(word)
  idx = word.rindex(/[aoiou]/)
  word[idx] = '' if idx
  word
end

if idx 是必需的,因为如果没有找到元音,rindex 会返回 nil。注意[]= 修改了word

还有rpartition,它以给定的模式分割字符串,返回一个包含之前部分、匹配部分和之后部分的数组。通过concat-enating前者和后者,可以有效去除中间部分:(即元音)

def hipsterfy(word)
  before, _, after = word.rpartition(/[aoiou]/)
  before.concat(after)
end

这个变体返回一个 new 字符串,而 word 保持不变。

处理一些 last 事件时的另一种常见方法是 reverse 字符串,以便您可以处理 first 事件(通常更简单)。在这里,您可以使用sub

def hipsterfy(word)
  word.reverse.sub(/[aeiou]/, '').reverse
end

【讨论】:

  • 你实际上是在强迫我投票给你的答案?,很好的答案。
【解决方案3】:

这是另一种方法。

  1. 反转字符串的字符

  2. 使用find_index 获取此反转字符串中的第一个元音位置

  3. 删除该索引处的字符

  4. 取消反转字符并将它们重新组合在一起。

    reverse_chars = str.chars.reverse
    vowel_idx = reverse_chars.find_index { |char| char =~ /[aeiou]/ }
    reverse_chars.delete_at(vowel_idx) if vowel_idx
    result = reverse_chars.reverse.join
    

【讨论】:

  • 你可以写vowel_idx = str.rindex(/[aeiou]/)。参考String#rindex
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2010-11-17
  • 2014-11-30
  • 2022-11-22
相关资源
最近更新 更多