gpt4 book ai didi

ruby - 正则表达式获取二进制内容之间的字节

转载 作者:太空宇宙 更新时间:2023-11-03 17:42:41 24 4
gpt4 key购买 nike

我有以下 3 个包含二进制数据的字符串。

s1="\t 28890\tABGT\tXYZW\t 94 23 08 92 00 00 00 EC 02 10 00 E2 00 4B\t\x00\x00\x00\x00\x01\f".force_encoding("ASCII-8BIT")
s2=" \t0000013\t123\t9886\t 95 83 49 26 0E 82 00 A6 08 02 06 C0\x00\x00\x00\x00\x02\xB2\x00\x00\x00\x00\b\xFEF".force_encoding("ASCII-8BIT")
s3=" \t0000013\t123\t9HN3\t 95 83 49 26 0E 82 00 A6 08 02 06 C0\xA1\x02\x00\x00\x02\xB2\b\xFEF".force_encoding("ASCII-8BIT")

我有以下 3 个类似的正则表达式来获取 *\t 之间的字节和以 \ 开头的东西(即\t、\x00、\xB2、\xFEF)

s1[/(?<=[A-Z]{4}\t ).+?(?=\t)/]
s2[/(?<=[0-9]{4}\t ).+?(?=\x00)/]
s3[/(?<=.+\t ).+?(?=\x..)/]

前 2 个正则表达式适用于字符串 s1 和 s2,但如何才能成为更通用的正则表达式来匹配这 3 种情况?

我试过正则表达式 s3[/(?<=.+\t ).+?(?=\x..)/]但我在下面收到错误。

irb(main):> s1[/(?<=[A-Z]{4}\t ).+?(?=\t)/]
=> "94 23 08 92 00 00 00 EC 02 10 00 E2 00 4B"

irb(main):> s2[/(?<=[0-9]{4}\t ).+?(?=\x00)/]
=> "95 83 49 26 0E 82 00 A6 08 02 06 C0"

irb(main):> s3[/(?<=.+\t ).+?(?=\x..)/]
SyntaxError: (irb):4953: invalid hex escape
s3[/(?<=.+\t ).+?(?=\x..)/]
^
invalid pattern in look-behind: /(?<=.+\t ).+?(?=..)/
from /usr/bin/irb:11:in `<main>'

我想我只需要有正确的正则表达式,或者是否有更好的方法来提取所需的值而不使用正则表达式?

感谢您的帮助

最佳答案

R = /\h{2}(?: \h{2})+/

def extract(str)
str[R]
end

extract(s1)
#=> "94 23 08 92 00 00 00 EC 02 10 00 E2 00 4B"
extract(s2)
#=> "95 83 49 26 0E 82 00 A6 08 02 06 C0"
extract(s3)
#=> "95 83 49 26 0E 82 00 A6 08 02 06 C0"

正则表达式为“匹配两个十六进制数字 (\h{2}) 后跟一个空格后跟两个十六进制数字,这三个字符作为一组匹配一次或多次 (+), (?:\h{2}) 是一个非捕获组

关于ruby - 正则表达式获取二进制内容之间的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54376439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com