什么是正确的正则表达式从文件中读取固定大小的前几个字节并从ruby中的第一个正则表达式(。*)部分读取剩余字节?

时间:2012-04-06 02:49:22

标签: ruby regex file byte

我正在使用ruby读取一个文件,其中我在我的代码中编写了regexp,假设它将从文件读取前4个字节,接下来的4个字节,接下来的4个字节,文件中的其余字节除了最后8个字节之外文件。 现在我尝试使用以下代码进一步从这些可变大小数据(。*)中分割字节。这是正确的方法吗?我得到了结果,但仍然不确定它们是否正确。

这是在第一个do..end中扫描第一个正则表达式的剩余星号部分的内容然后再次扫描第二个do..end正则表达式中的剩余字节的正确方法吗?

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

1 个答案:

答案 0 :(得分:0)

对我来说很好。

建议使用\ A和\ z

将扫描锚定在字符串的开头和结尾处
/\A...\z/

在我看来,这样可以更容易地快速查看您想要匹配整个字符串,而不是使用#scan来迭代匹配。它也可能表现得更快。