用于从文件中提取一系列十六进制数的正则表达式

时间:2014-04-06 18:15:15

标签: regex perl

我正在检查文件的对象转储,我想找出所有可能的地址。

我使用的方法涉及使用perl和regex来提取所有单词

目标文件的格式如下

00000000000044444 <function>
    44448: 48 ca             add ....
    4444c: 48 ca 55          call ....
    44450: 48 ca 8d 55       jmp..

我正在尝试提取48 ca 48 ca 55 48 ca 8d 55

目前,我认为正则表达式/(\s[0-9a-f][0-9a-f]\s)/g会有所帮助,只会解析所有其他内容,即48, 8d, 55,因为它会解析48然后无法解析ca因为之前的空间角色已被消耗(至少这是我的理解)

/(\s[0-9a-f][0-9a-f]\s)|([0-9a-f][0-9a-f]\s)/g但是这解析了它不应该是add instruction dd

关于如何只提取由空格分隔的这些数字对的任何帮助?

编辑:我更新了更真实的文件格式。

谢谢

4 个答案:

答案 0 :(得分:1)

尝试使用正向前导中的正则表达式执行重叠匹配的示例:

$\ = $/;
while(<DATA>){
    print for m/(?=\s([0-9a-f][0-9a-f])\s)/g;
}

__DATA__
00000000000044444 <function>
    44448: 48 ca 8d 55
    4444c: 48 ca 8d 55
    44450: 48 ca 8d 55

答案 1 :(得分:1)

而不是\s,您只需要边框\b

while (<DATA>) {
    my @nums = m/\b([[:xdigit:]]{2})\b/g;
    print "@nums\n";
}

__DATA__
00000000000044444 <function>
    44448: 48 ca 8d 55
    4444c: 48 ca 8d 55
    44450: 48 ca 8d 55

<强>更新

鉴于,您在十六进制代码之后使用指令使您的数据更加复杂,我倾向于使您的正则表达式更具限制性;

while (<DATA>) {
    if (/^\s+\w+:((?:\s[[:xdigit:]]{2})+)\b/) {
        my @nums = split ' ', $1;
        print "@nums\n";
    }
}

__DATA__
00000000000044444 <function>
    44448: 48 ca             add ....
    4444c: 48 ca 55          call ....
    44450: 48 ca 8d 55       jmp..

输出:

48 ca
48 ca 55
48 ca 8d 55

答案 2 :(得分:0)

试试这个:

(([0-9a-f]{2}\s){3}[0-9a-f]{2})$

[0-9a-f]{2}是一对十六进制数字。

将那些空格分组三次,然后再寻找另一对十六进制数字。

$将它锚定到该行的末尾。

答案 3 :(得分:0)

您可以使用:

while(<DATA>) {
    print m/(?:(?<=:)|\G)( [a-f0-9]{2})(?=\s)/g;
}


__DATA__
00000000000044444 <function>
    44448: 48 ca             add ....
    4444c: 48 ca 55          call ....
    44450: 48 ca 8d 55       jmp..

构建模式是为了强制字节与\G连续或在:之前。 (如果它不够,您可以在[0-9a-f]{5}之前添加: