Как мне проверить, содержит ли строка два или более гласных в ruby? - PullRequest
1 голос
/ 26 марта 2012

Как проверить, содержит ли строка два или более гласных?

У меня есть следующий код, но он проверяет только 2 гласных рядом друг с другом.Я просто хочу знать, содержит ли строка два или более гласных независимо от того, где они появляются в строке.

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

Ответы [ 3 ]

4 голосов
/ 26 марта 2012

Вы можете использовать scan, который возвращает массив со всеми совпадениями:

if word.scan(/[aeiou]/).count >= 2
  puts word
end
1 голос
/ 26 марта 2012

Первые несколько вопросов:

  1. Что такое гласная? В вашем примере у вас есть y. В моих глазах y не гласный. А как насчет умлаутов?
  2. Только строчными буквами или также заглавными буквами?

В моем примере вы можете принять константу VOWELS к своему определению.

Я думаю, что проще всего было сосчитать гласные с String#count.

Ниже приведен пример с тремя вариантами a-c.

Вы написали о двух гласных, а не о двух разных гласных. Мои решения a + b работают только для двух гласных, даже одного и того же. Вариант с работает только в том случае, если в слове есть хотя бы два разных гласных.

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)
1 голос
/ 26 марта 2012

Вы можете использовать что-то вроде:

/[aeiouy].*?[aeiouy]/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...