繁体   English   中英

Ruby 从一个单词问题中取出最后一个元音

[英]Ruby taking the last vowel from a word problem

我一直在强调一个我觉得我应该解决的问题,但不知道为什么它不起作用。

基本上是一个接受一个单词并返回一个没有最后一个元音的单词的方法。

我的代码是:

def lastvowel(word)
    vowels = "aeiou"

    if vowels.include? (word)
        word.reverse.sub(/[aeiou]/, "").reverse
    else
        return word 
    end


end

问题是元音。包括? (字)不工作? 但我觉得它应该工作? 也许我在想别的东西。 所以我改为这样:

def lastvowel(word)
    vowel = "aeiou"

    word.each_char do |x|
        if vowel.include?(x) 
        return word.reverse.sub(/[aeiou]/, "").reverse
        end
    end
return word

end

是我对.include的理解吗? 方法不对? 任何帮助将不胜感激,在此先感谢您。

您可以定义String#lastvowel

class String
  def lastvowel
    sub(/(.*)[aeiou](.*)/,'\1\2')
  end
end

并像这样使用:

"something".lastvowel
=> "somethng"

vowels.include? (word) vowels.include? (word)将测试例如该词是否在字符串"aeiou"中找到。 首先,您可能想反过来测试元音是否在单词中,而不是单词是否在元音中; 其次,英语中没有任何单词将"aeiou"作为其 substring(最接近的 AFAIK 是"leguleious""epigaeous""glutaeous""paeounlae" ,其中一个元音缺失)。

您想知道单词中是否包含任何元音; 写元音的最短方法是vowels.any? { |vowel| word.include?(vowel) } vowels.any? { |vowel| word.include?(vowel) } vowels.any? { |vowel| word.include?(vowel) } . 检查并不是真正必要的,如果单词中没有元音,你只会做一些不必要的反转。

最后,您可以在一个sub中完成所有操作,无需反转,也无需测试:

word.sub(/[aeiou](?!.*?[aeiou])/, "")

(“一个元音后面不跟着东西和另一个元音”)

"problematic".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
  #=> "problematc"

"HELLO".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
  #=> "HELL"

"sly".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
  #=> "sly"

请参阅字符串#sub

正则表达式读取,“匹配任何元音 ( [aeiou] ) 后跟零个或多个 ( * ) 元音以外的字符 ( [^aeiou] ),然后是字符串的结尾 ( \z ),匹配不区分大小写( /i )”。

[aeiou]是一个字符 class ,这意味着要匹配其内容之一。

(?=[^aeiou]*\z)积极的前瞻(由?=表示)。

[^aeiou]也是一个字符 class,但是第一个 position 中的克拉 ( ^ ) 表示要匹配除^后面的字符之外的一个字符。 这里指的是辅音。

另一种方法是使用方法String#rindex

str = "problematic"
idx = str.rindex(/[aeiou]/i)
idx ? (str[0,idx]+str[idx+1..-1]) : str
  #=> "problematc"

str = "A"
idx = str.rindex(/[aeiou]/i)
idx ? (str[0,idx]+str[idx+1..-1]) : str
  #=> ""

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM