Как эффективно отклонить строки в массиве, если они (регулярные выражения) соответствуют строкам во втором массиве в Ruby? - PullRequest
0 голосов
/ 06 декабря 2009

У меня есть два массива строк, например, предложения и слова. Если в предложении найдено какое-либо слово, например, sentence =~ /#{word}/ Я хочу отклонить предложение из массива предложений. Это легко сделать с помощью двойного цикла, но мне интересно, есть ли более эффективный способ сделать это, возможно, с помощью логических операторов?

Ответы [ 4 ]

1 голос
/ 07 декабря 2009

Объединение строк в регулярное выражение - довольно плохая идея, потому что обратное отслеживание ужасно замедляет работу и потому что вы довольно быстро сталкиваетесь с ограничениями размера регулярного выражения. (Хотя на практике это может хорошо работать, если wordarray мало)

Рассмотрите возможность использования одного из DictionaryMatcher Ruby Quiz.

Тогда вы можете действовать следующим образом:

dm=DictionaryMatcher.new
wordarray.each{|w| dm << w}
sentencearray.reject{|s| s =~ dm}
1 голос
/ 06 декабря 2009

Вычитание массива Ваш друг здесь:

words.each do |word|
  sentences -= sentences.grep(/#{word}/)
end

Это все та же базовая сложность времени (возможно, менее эффективная в целом), но вы можете обойтись без записи двойного цикла.

Имейте в виду, что с этим решением слова не должны совпадать со всеми разделенными пробелами словами в предложении. Итак, слово cat выбило бы предложение: String concatenation is gross.

0 голосов
/ 06 декабря 2009
words = [...]
sentences = [....]

result = sentences.select{|sentence| !words.any?{|word| sentence =~ /#{word}/}}
0 голосов
/ 06 декабря 2009

Вы можете объединить все слова в одно регулярное выражение со словами, разделенными "|" характер.

sentence =~ /word1|word2|..../

Вы можете преобразовать массив слов в подходящее регулярное выражение с помощью array.join ("|").

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

sentence =~ /(?:word1)|(?:word2)|..../

Использование одного регулярного выражения должно быть гораздо более эффективным, чем циклический просмотр массива слов, поскольку регулярное выражение будет скомпилировано в одну таблицу состояний.

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