正则表达式构建文件系统爬虫问题

时间:2012-12-18 18:18:30

标签: ruby regex macos filesystems web-crawler

我正在构建一个爬虫来搜索我的文件系统,查找包含特定信息的特定文档。然而,正则表达式部分让我有点困惑。我的桌面上有一个包含'teststring'和测试信用卡号'4060324066583245'的测试文件,下面的代码将正常运行并找到包含teststring的文件:

require 'find'
count = 0

Find.find('/') do |f|              # '/' for root directory on OS X
  if f.match(/\.doc\Z/)            # check if filename ends in desired format
    contents =  File.read(f)
      if /teststring/.match(contents) 
      puts f
      count += 1
    end
  end
end

puts "#{count} sensitive files were found"

运行此操作可确认爬网程序正在运行并正确查找匹配项。但是,当我尝试运行它以查找测试信用卡号时,它找不到匹配项:

require 'find'
count = 0

Find.find('/') do |f|              # '/' for root directory on OS X
  if f.match(/\.doc\Z/)            # check if filename ends in desired format
    contents =  File.read(f)
      if /^4[0-9]{12}(?:[0-9]{3})?$/.match(contents) 
      puts f
      count += 1
    end
  end
end

puts "#{count} sensitive files were found"

我使用4060324066583245检查了rubular.com上的正则表达式作为测试数据,该数据包含在我的测试文档中,Rubular验证该数字是否与正则表达式匹配。总结一下:

  1. 抓取工具使用teststring处理第一个案例 - 验证抓取工具是否正确扫描我的文件系统并读取所需文件类型的内容
  2. Rubular验证我的正则表达式是否成功匹配我的测试信用卡号4060324066583245
  3. 抓取工具无法找到测试信用卡号。
  4. 有什么建议吗?我不知道为什么Rubular会将正则表达式显示为正常工作,但在我的机器上运行时脚本将无效。

1 个答案:

答案 0 :(得分:2)

^$是将匹配分别绑定到字符串开头和结尾的锚点。

因此,^[0-9]{4}$将匹配"1234",但不会匹配"12345"" 1234 "等。

您应该使用字边界:

if contents =~ /\b4[0-9]{12}(?:[0-9]{3})?\b/