onestone01 发表于 2020-7-15 14:59:00

求正则提取16进制 部分字符(文件名)[已解决]

本帖最后由 onestone01 于 2020-7-16 16:44 编辑

想提取 16进制中的文件名
示例字符:44003A005C0061005C0062005C00610031002E00650078006500000344003A005C0061005C00630073002E0064006C006C000003
需要提取:44003A005C0061005C0062005C00610031002E00650078006500000344003A005C0061005C00630073002E0064006C006C000003
也就是提取一个路径中的文件名 610031002E00650078006500(转换后为 a1.exe);630073002E0064006C006C00 (转换后为cs.dll);
匹配起始位置后面一个5C00至0003之间的字符,字符串包含多个5C00,就不会了。

#include <Array.au3>
Local $sSource = '44003A005C0061005C0062005C00610031002E00650078006500000344003A005C0061005C00630073002E0064006C006C000003'
;~MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '5C00(.*?)0003', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中元素为: ' & $aSRE)
_ArrayDisplay($aSRE, UBound($aSRE))



afan 发表于 2020-7-15 15:01:51

为何不先转换为明文

onestone01 发表于 2020-7-15 15:04:39

afan 发表于 2020-7-15 15:01
为何不先转换为明文

这是读取一个文件的二进制数据,部分数据转换不了或者转换后乱码

afan 发表于 2020-7-15 15:10:41

你这样读取不一定就是按字节(2字符)分割的位置。可能是错位的~ 需要从头读取 ^(?:..)* xxx,如果不确定数量,需要再循环找第二个

onestone01 发表于 2020-7-15 15:20:30

本帖最后由 onestone01 于 2020-7-15 15:22 编辑

afan 发表于 2020-7-15 15:10
你这样读取不一定就是按字节(2字符)分割的位置。可能是错位的~ 需要从头读取 ^(?:..)* xxx,如果不确定数量 ...
确实可能是错位的,我查看发现的规律。我想要获取的文件名在5C00至0003之间的字符。5C00(\)错位的概率应该不大吧

afan 发表于 2020-7-15 15:24:13

onestone01 发表于 2020-7-15 15:20
确实可能是错位的,我查看发现的规律。我想要获取的文件名在5C00至0003之间的字符。5C00(\)错位的概率 ...
只能说不可靠,程序不健壮,会有隐患~

afan 发表于 2020-7-15 15:28:41

本帖最后由 afan 于 2020-7-16 12:52 编辑

匹配后面那个示例
Highlight code by AuREHelper
^(?:..)*5C00((?:(?!5C00)..)+?)0003


onestone01 发表于 2020-7-15 15:32:05

afan 发表于 2020-7-15 15:28
匹配后面那个示例

非常感谢!我先试试

862228699 发表于 2020-7-15 15:33:51

这个我也觉得不可靠吧。

onestone01 发表于 2020-7-15 15:38:35

本帖最后由 onestone01 于 2020-7-15 15:43 编辑

afan 发表于 2020-7-15 15:28
匹配后面那个示例
可能我表述的不太清楚正则实在不太懂。
需要提取这两个(实际可能包含多个文件名)红色字符: 610031002E00650078006500(转换后为 a1.exe);630073002E0064006C006C00 (转换后为cs.dll)




afan 发表于 2020-7-16 12:50:01

还没解决?

Highlight code by AuREHelper
5C00((?:(?!5C00)..)+?)0003


页: [1]
查看完整版本: 求正则提取16进制 部分字符(文件名)[已解决]