求正则提取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
为何不先转换为明文
这是读取一个文件的二进制数据,部分数据转换不了或者转换后乱码 你这样读取不一定就是按字节(2字符)分割的位置。可能是错位的~ 需要从头读取 ^(?:..)* xxx,如果不确定数量,需要再循环找第二个 本帖最后由 onestone01 于 2020-7-15 15:22 编辑
afan 发表于 2020-7-15 15:10
你这样读取不一定就是按字节(2字符)分割的位置。可能是错位的~ 需要从头读取 ^(?:..)* xxx,如果不确定数量 ...
确实可能是错位的,我查看发现的规律。我想要获取的文件名在5C00至0003之间的字符。5C00(\)错位的概率应该不大吧 onestone01 发表于 2020-7-15 15:20
确实可能是错位的,我查看发现的规律。我想要获取的文件名在5C00至0003之间的字符。5C00(\)错位的概率 ...
只能说不可靠,程序不健壮,会有隐患~ 本帖最后由 afan 于 2020-7-16 12:52 编辑
匹配后面那个示例
Highlight code by AuREHelper
^(?:..)*5C00((?:(?!5C00)..)+?)0003
afan 发表于 2020-7-15 15:28
匹配后面那个示例
非常感谢!我先试试 这个我也觉得不可靠吧。 本帖最后由 onestone01 于 2020-7-15 15:43 编辑
afan 发表于 2020-7-15 15:28
匹配后面那个示例
可能我表述的不太清楚正则实在不太懂。
需要提取这两个(实际可能包含多个文件名)红色字符: 610031002E00650078006500(转换后为 a1.exe);630073002E0064006C006C00 (转换后为cs.dll)
还没解决?
Highlight code by AuREHelper
5C00((?:(?!5C00)..)+?)0003
页:
[1]