查找并打印完全匹配字符串或regexp(Ruby)的文件中的行

时间:2013-02-20 14:29:22

标签: ruby regex file-io

在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个字符的排列,它们本身就是完整的单词,所以我在只有在与排列完全匹配的情况下才能打印文本文件。

我做错了什么?提前谢谢!

4 个答案:

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