Возникли проблемы с подстановочными символами в массиве - PullRequest
0 голосов
/ 20 апреля 2010

У меня есть основной текстовый файл и файл исключений, и я хочу сопоставить все слова в файле исключений с основным файлом и счетчиком увеличения, но дело в подстановочных знаках.

Я могу обойтись без подстановочных знаков с этим:

words = %w(aaa aab acc ccc AAA)
stop = %q(/aa./)

words.each do |x|
    if x.match(/aa./)
     puts "yes for #{x}"        
    else    
     puts "no for #{x}"
    end
end

=>

yes for aaa
yes for aab
no for acc
no for ccc
yes for AAA

Также, что было бы лучшим способом для этого, используя массивы или каким-либо другим способом.

Редактировать: Извините за путаницу. Да, в stop есть несколько подстановочных знаков, и я хочу сопоставить все слова на основе этих подстановочных знаков.

words = %w(aaa aab acc ccc AAA)
stop = %q(aa* ac* ab*)

Спасибо

1 Ответ

1 голос
/ 20 апреля 2010

Описание ваших требований действительно расплывчато. Но методы partition или select подойдут вам:

words = %w(aaa aab acc ccc AAA)
re = %r(aa.)i
p words.partition {|word| word.match(re)}  # => [["aaa", "aab", "AAA"], ["acc", "ccc"]]
p words.select {|word| word.match(re)}     # => ["aaa", "aab", "AAA"]

UPDATE

Основано на вашем последнем комментарии:

stops= %q(aa* ac* ab*)
stops.split.collect do |wildcard| 
  re = Regexp.new(wildcard, Regexp::IGNORECASE)
  words.select {|word| word.match(re)} 
end
# => [["aaa", "aab", "acc", "AAA"], ["aaa", "aab", "acc", "AAA"], ["aaa", "aab", "acc", "AAA"]]

Если эти результаты вас удивят, вы, возможно, захотите узнать больше о регулярных выражениях, которые сильно отличаются и более эффективны, чем шаблоны в стиле glob. Ruby не выполняет глобальное сопоставление строк.

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