如何测试一个字符串是否包含ruby中的两个或更多元音?

时间:2012-03-26 18:48:20

标签: ruby regex

如何测试字符串是否包含两个或更多元音?

我有以下代码,但它只测试了彼此相邻的2个元音。我只是想知道字符串是否包含两个或更多元音,无论它们出现在字符串中的哪个位置。

    if /[aeiouy]{2,}/.match(word)
      puts word
    end

3 个答案:

答案 0 :(得分:4)

您可以使用scan返回包含所有匹配项的数组:

if word.scan(/[aeiou]/).count >= 2
  puts word
end

答案 1 :(得分:1)

您可以使用以下内容:

/[aeiouy].*?[aeiouy]/

答案 2 :(得分:1)

首先提出一些问题:

  1. 什么是元音?在您的示例中,您有y。在我看来,y不是元音。什么是变音符号?
  2. 只有小写字母或大写字母?
  3. 在我的示例中,您可以对定义采用常量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)