我正在构建一个爬虫来搜索我的文件系统,查找包含特定信息的特定文档。然而,正则表达式部分让我有点困惑。我的桌面上有一个包含'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
处理第一个案例 - 验证抓取工具是否正确扫描我的文件系统并读取所需文件类型的内容4060324066583245
有什么建议吗?我不知道为什么Rubular会将正则表达式显示为正常工作,但在我的机器上运行时脚本将无效。
答案 0 :(得分:2)
^
和$
是将匹配分别绑定到字符串开头和结尾的锚点。
因此,^[0-9]{4}$
将匹配"1234"
,但不会匹配"12345"
或" 1234 "
等。
您应该使用字边界:
if contents =~ /\b4[0-9]{12}(?:[0-9]{3})?\b/