如何测试字符串是否包含两个或更多元音?
我有以下代码,但它只测试了彼此相邻的2个元音。我只是想知道字符串是否包含两个或更多元音,无论它们出现在字符串中的哪个位置。
if /[aeiouy]{2,}/.match(word)
puts word
end
答案 0 :(得分:4)
您可以使用scan
返回包含所有匹配项的数组:
if word.scan(/[aeiou]/).count >= 2
puts word
end
答案 1 :(得分:1)
您可以使用以下内容:
/[aeiouy].*?[aeiouy]/
答案 2 :(得分:1)
首先提出一些问题:
y
。在我看来,y
不是元音。什么是变音符号?在我的示例中,您可以对定义采用常量VOWELS
。
我认为最简单的方法是用String#count
来计算元音。
下面是三个变体a-c的例子。
你写了两个元音,而不是两个不同的元音。我的解决方案a + b仅适用于两个元音,即使它是相同的元音。如果单词中至少有两个不同的元音,则变体c仅起作用。
VOWELS = 'aeiouyAEIOUY'
%w{
test
teste
testa
}.each{|word|
puts 'a: ' + word if word.count(VOWELS) > 1
puts 'b: ' + word if /[#{VOWELS}].*?[#{VOWELS}]/ =~ word
puts 'c: ' + word if word.scan(/[#{VOWELS}]/).uniq.count > 1
}
我做了一个基准。 count
解决方案是最快的。
require 'benchmark'
N = 10_000 #Number of Test loops
VOWELS = 'aeiouyAEIOUY'
TESTDATA = %w{
test
teste
testa
}
Benchmark.bmbm(10) {|b|
b.report('count') { N.times { TESTDATA.each{|word| word.count(VOWELS) > 1} } }
b.report('regex') { N.times { TESTDATA.each{|word| /[#{VOWELS}].*?[#{VOWELS}]/ =~ word} } }
b.report('scab') { N.times { TESTDATA.each{|word| word =~ /[#{VOWELS}].*?[#{VOWELS}]/ } } }
b.report('scan/uniq') { N.times { TESTDATA.each{|word| word.scan(/[#{VOWELS}]/).uniq.count > 1 } } }
} #Benchmark
结果:
Rehearsal ---------------------------------------------
count 0.031000 0.000000 0.031000 ( 0.031250)
regex 0.562000 0.000000 0.562000 ( 0.562500)
scab 0.516000 0.000000 0.516000 ( 0.515625)
scan/uniq 0.437000 0.000000 0.437000 ( 0.437500)
------------------------------------ total: 1.546000sec
user system total real
count 0.031000 0.000000 0.031000 ( 0.031250)
regex 0.500000 0.000000 0.500000 ( 0.515625)
scab 0.500000 0.000000 0.500000 ( 0.500000)
scan/uniq 0.422000 0.000000 0.422000 ( 0.437500)