2012-04-06 2 views
0

Ich lese eine Datei mit Ruby, in dem ich regexp in meinem Code geschrieben habe, wie unten unter der Annahme, dass es die ersten 4 Bytes aus der Datei liest, die nächsten vier Bytes, die nächsten vier Bytes, den Rest der Bytes in der Datei mit Ausnahme der letzten 8 Bytes aus der Datei . Jetzt versuche ich, Bytes von diesen Daten der variablen Größe (. *) Unter Verwendung des folgenden Codes weiter zu teilen. Ist dieser korrekte Weg? Ich bekomme Ergebnisse, bin aber immer noch unsicher, ob sie korrekt sind oder nicht.Was könnte die richtige Regex sein, um die ersten paar Bytes in der Datei mit fester Größe zu lesen und die restlichen Bytes aus dem ersten Regex-Teil (. *) In Ruby zu lesen?

Ist dies der richtige Weg, um den Inhalt des verbleibenden Sterns Teil des ersten Regex in ersten do..end zu scannen und dann noch einmal die verbleibenden Bytes im zweiten do..end Regex zu scannen?

File.open(filename,'rb') do |file| 
file.read.scan(/(.{4})(.{4})(.{4})(.*)(.{8})/m).each do |a,b,c,d,e| 
    puts "\Content 1:#{a}\n\n" 
    b1 = b.unpack("N") 
    puts "\n\nContent 2:\n#{b1}\n\n" 
    puts "\n\nContent 3:\n#{c.unpack("N")}\n\n" 
      d.scan(/(.{4})(.{4})(.{4})(.*)/).each do |p,q,r,s| 
       puts "\n\nPContent 4:\n#{p.unpack("N")}\t" 
       puts "Content 5\n:#{q.unpack("e")}\t" 
       puts "Content 6:\n#{r.unpack("e")}\t" 
       s.scan(/(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.*)/).each do |f,g,h,i,j,k,l,m,n,o,p| 
        puts "Content 7:#{f.unpack("e")}" 
        puts "Content 8:#{g.unpack("B")}" 
        puts "Content 9:#{h.unpack("B")}" 
        puts "Content 10:#{i.unpack("B")}" 
        puts "Content 11:#{j.unpack("e")}" 
        puts "Content 12:#{k.unpack("e")}" 
        puts "Content 13:#{l.unpack("e")}" 
        puts "Content 14:#{m.unpack("B")}" 
        puts "Content 15:#{n.unpack("B")}" 
        puts "Content 16:\t#{o}#{p}" 
       end 
      end 
+0

Ich habe dies auf http://rubular.com/r/L4xnGbvukW für Sie geschrieben, es ist ein fantastisches "Instant" -Tool zum Spielen mit Regexp –

Antwort

0

Sieht gut aus für mich.

Ein Vorschlag ist der Scan am Anfang und Ende des Strings zu verankern, indem \ mit A und \ z

/\A...\z/ 

Meiner Meinung nach macht es einfacher, schnell zu sehen, dass Sie die gesamte übereinstimmen soll string, anstatt #scan zu verwenden, um Übereinstimmungen zu iterieren. Es kann auch schneller funktionieren.

+0

Wie kann ich null terminierte ASCII (0x00) Zeichenfolge erkennen? –

+0

Sie können /\A...\000\z/ verwenden – joelparkerhenderson

Verwandte Themen