在ruby 1.9.3中,我正在尝试编写一个程序,该程序将查找从任意字符集中取出的 n 字符数的所有单词。所以,例如,如果我给出了字符[b,a,h,s,v,i,e,y,k,s,a]和n = 5,我需要找到所有可以使用的5个字母的单词只使用那些字符。使用http://wordlist.sourceforge.net/中的2of4brif.txt单词列表(也包括英语单词和拼写),我尝试了以下代码:
a = %w[b a h s v i e y k s a]
a.permutation(5).map(&:join).each do |x|
File.open('2of4brif.txt').each_line do |line|
puts line if line.match(/^[#{x}]+$/)
end
end
这没有任何作用(没有错误消息,没有输出,就像冻结一样)。我还尝试了基于以下主题的变体:
What's the best way to search for a string in a file?
Ruby find string in file and print result
How to search for exact matching string in a text file using Ruby?
Finding lines in a text file matching a regular expression
Match a content with regexp in a file?
How to open a file and search for a word?
我尝试的每一个变体都导致:
1)冻结;
2)打印列表中包含5个字符排列的所有单词(我假设它正在做的事情;我没有检查所有数千个打印的单词);或
3)打印列表中单词中的所有5个字符的排列(再次,我认为这就是它正在做的事情)。
同样,我不是在寻找包含 5个字符排列的单词,我正在寻找5个字符的排列,它们本身就是完整的单词,所以我在只有在与排列完全匹配的情况下才能打印文本文件。
我做错了什么?提前谢谢!
答案 0 :(得分:2)
你真的不是在这里使用正则表达式。你的程序效率很低,不仅因为你已经指出了为每个单独的排列重新打开文件(并且有55k!);但最重要的是因为你想做的就是
/^[bahsvieyksa]{5}$/
为文件的每一行。
我建议:
File.open('2of4brif.txt').each_line do |line|
puts line if line.match(/^[bahsvieyksa]{5}$/)
end
作为一种更有效的替代方案
答案 1 :(得分:1)
这适用于我使用该页面上的english.0文件(抱歉,我找不到您提到的具体文件):
a = %w[b a h s v i e y k s a l d n]
dict = {}
a.permutation(5).each do |p|
dict[p.join('')] = true
end
File.open('english.0').each_line do |line|
line.chomp!.downcase!
puts line if dict[line]
end
结构应该非常清楚 - 我在一个巨大的哈希中预先建立了排列字典(你可能需要根据输入大小重新考虑这个,但这些天内存很便宜)然后我用了这个事实输入是“每行一个字”,只需键入该哈希。
另请注意,在我的版本中,我只阅读了一次文件。在你的每个排列中你扫描一次文件,并且有数千个排列。
答案 2 :(得分:0)
更简单的方法是只计算每个字符的出现次数并进行比较:
a = %w[b a h s v i e y k s a l d n]
File.read('2of4brif.txt').split("\n").each do |line|
puts line if line.size == 5 && line.chars.all?{|x| line.count(x) <= a.count(x)}
end
答案 3 :(得分:0)
对我来说,以下结果
File.open('file.txt').each_line do |line|
puts line if line[/<regexp>/]
end