Регулярное выражение: если включены три буквы - PullRequest
2 голосов
/ 20 декабря 2010

У меня есть несколько слов: hello, poison, world, search, echo ... И у меня есть несколько букв e, h, o Теперь мне нужно найти все слова, которые включают эти буквы.Как и search, echo для e, h, o

Я могу искать следующим образом:

words = %w[hello poison world search echo]
matched = words.select do |w|
  %w[e,h,o].all?{ |l| w =~ /#{l}/ }
end

Проблема в том, что если буквы o, o, o или l, b, l, этот поиск вернет true длятакие слова, как open или boil, но мне нужно искать слова, которые включают три из o или два из l и одно b

upd:

leters = "abc"
words.select{ |w| w.count(letters) >= 3 }

upd 2

Плохое решение, пример:

"lllllll".count("lua") #=> 5

Ответы [ 4 ]

1 голос
/ 20 декабря 2010

Попробуйте изменить слово (чтобы оно уменьшалось с каждой проверкой).

words = %w(fooo for find o ooo)
matched = words.select do |orig|
  # note: str.gsub! returns nil if nothing was replaced
  w = orig.clone
  %w(o o o).all?{ |l| w.gsub!(/^(.*)(#{l})(.*)$/, '\1\3') }
end
1 голос
/ 20 декабря 2010

Вы уверены, что хотите регулярное выражение? Строки поддерживают подсчет значений в них, вы можете использовать эту функцию. Примерно так:

words = ["pool", "tool", "troll", "lot"]
letters = "olo"

#find how many of each letter we need
counts = {}
letters.each { |v| counts[v] = letters.count(v) }

#See if a given work matches all the counts
# accumulated above
res = words.select do |w|
  counts.keys.inject(true) do |match, letter| 
      match && (w.count(letter) == counts[letter])
  end
end
1 голос
/ 20 декабря 2010

Вероятно, для этого лучше не использовать регулярные выражения, но это можно сделать:

Все три буквы разные:

/^(?=.*a)(?=.*b).*c/

Два одинаковых и один разных:

/^(?=.*a.*a).*b/

Все три одинаковы:

/^.*a.*a.*a/
0 голосов
/ 20 декабря 2010

выглядит сумасшедшим, но работает:

leters = "abc"
words.select{ |w| w.count(letters) >= 3 }

Но это не работает с кириллицей: (* ​​1004 *

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