在数组中遇到匹配通配符的问题

时间:2010-04-20 11:44:07

标签: ruby

我有一个主文本文件和例外文件,我希望将例外文件中的所有单词与主文件匹配并增加计数器,但诀窍是使用通配符。

我可以不使用通配符:

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 个答案:

答案 0 :(得分:1)

您的要求描述非常模糊。但partitionselect方法适用于您:

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"]

<强>更新

根据您的上一条评论:

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不对字符串进行全局匹配。