Ruby 关于构建文件系统爬虫的正则表达式问题
我正在构建一个爬虫来搜索我的文件系统中包含特定信息的特定文档。然而,regex部分让我有点困惑。我的桌面上有一个包含“teststring”和测试信用卡号码“4060324066583245”的测试文件,下面的代码将正常运行并找到包含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/)
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
处理第一种情况-验证爬虫程序是否正确扫描我的文件系统并读取所需文件类型的内容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上运行。