Ruby 关于构建文件系统爬虫的正则表达式问题

Ruby 关于构建文件系统爬虫的正则表达式问题,ruby,regex,macos,filesystems,web-crawler,Ruby,Regex,Macos,Filesystems,Web Crawler,我正在构建一个爬虫来搜索我的文件系统中包含特定信息的特定文档。然而,regex部分让我有点困惑。我的桌面上有一个包含“teststring”和测试信用卡号码“4060324066583245”的测试文件,下面的代码将正常运行并找到包含teststring的文件: require 'find' count = 0 Find.find('/') do |f| # '/' for root directory on OS X if f.match(/\.doc\Z/)

我正在构建一个爬虫来搜索我的文件系统中包含特定信息的特定文档。然而,regex部分让我有点困惑。我的桌面上有一个包含“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验证该数字是否与正则表达式匹配。总而言之:

  • 爬虫程序使用
    teststring
    处理第一种情况-验证爬虫程序是否正确扫描我的文件系统并读取所需文件类型的内容
  • Rubular验证我的正则表达式是否成功匹配我的测试信用卡号
    4060324066583245
  • 爬虫程序找不到测试信用卡号

  • 有什么建议吗?我不明白为什么Rubular显示正则表达式工作,但脚本在我的机器上运行时不工作。

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

    因此,
    ^[0-9]{4}$
    将匹配
    “1234”
    ,但不匹配
    “12345”
    “1234”

    您应该改为使用单词边界:

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

    附带问题-在这种情况下使用
    =~
    match()
    之间是否存在显著差异?ruby文档显示,它们都可以用于匹配,但是
    =~
    可以用于显示匹配数据的位置。@Anconia:两者都相等匹配;我更喜欢较短的版本,但我想这是一个选择的问题,如果你所做的只是检查是否存在匹配,而不是确切匹配的内容或位置。从技术上讲,
    ^
    $
    锚定到行的开头和结尾,
    \A
    \z
    锚定到字符串的开头和结尾。@muistooshort:啊,是的,
    /s
    /m
    /m
    不存在,这就是Ruby的奇怪之处……谢谢!你在用什么操作系统?Mac OS和Linux包括
    grep
    ,可以很快完成这项工作,并且运行速度比Ruby快。我使用的是OS X,但我希望该程序也能在Windows上运行。