2010-04-20 107 views
0

我有一个主文本文件和异常文件,我想匹配所有的异常文件与主文件中的单词,并增加计数器,但诀窍是通配符。数组匹配通配符遇到问题

我能不带通配符与此有关:

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 

而且这将是去了解这一点,使用数组或其他方式的最佳途径。

编辑:对不起,混乱。是的,停止有多个通配符,我想匹配基于这些通配符的所有单词。

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

感谢

回答

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

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

如果这些结果会让你大吃一惊,你可能想了解更多关于正则表达式的信息,它们与全局样式相比有很大的不同并且更加强大。 Ruby不会在字符串上进行glob匹配。

+0

这适用于一个通配符表达式。怎么样多个通配符? – 2010-04-20 22:35:21

+0

@Senthil,你是什么意思?你的意思是'stop'是一组正则表达式吗?你需要更新你的问题,并显示你的意思是“多个通配符”。 – 2010-04-21 00:09:04

+0

是的。这是我原来的'stop =%q(aa * ac * ab *)'谢谢 – 2010-04-21 00:14:38