1

特定の情報を含む特定のドキュメントをファイル システムで検索するクローラーを構築しています。ただし、正規表現の部分には少し困惑しています。デスクトップに '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. クローラーがテスト クレジット カード番号を見つけられません。

助言がありますか?Rubular で正規表現が機能していると表示されるのに、自分のマシンでスクリプトを実行するとスクリプトが機能しない理由がわかりません。

4

1 に答える 1

2

^および$は、一致をそれぞれ文字列の最初と最後に結び付けるアンカーです。

したがって、^[0-9]{4}$は一致しますが、 orなどは一致"1234"しません。"12345"" 1234 "

代わりに単語境界を使用する必要があります。

if contents =~ /\b4[0-9]{12}(?:[0-9]{3})?\b/
于 2012-12-18T18:25:02.110 に答える