[英]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.