gpt4 book ai didi

regex - Perl正则表达式间隔匹配对应于十六进制数的字符串

转载 作者:行者123 更新时间:2023-12-04 02:32:10 25 4
gpt4 key购买 nike

我正在尝试提取一些与指定的 8 位地址范围匹配的数据。

例如,如果我想捕获 A0000000A0003CFF 之间的所有字符串,由于字符类定义导致字符序列 A000[0000-3CFF] 不起作用,然后我需要编写以下模式:

[0-2][0-F][0-F][0-F]|3[0-B][0-F][0-F]|3C[0-F][0-F]这将匹配 0000--2FFFF 之间的所有帧或 3000-3BFFF3C00 3CFF .

这种模式对于给定范围来说确实是特定的,在我的限制之间有给定的相同部分(在我的示例中,它是 4 个常见数字 A000)

但是,如果事先知道地址范围或公共(public)部分,但可以自由选择,我如何才能将其转换为更通用的解决方案?

正则表达式中是否存在捕获此问题的简单方法?

感谢帮助

[编辑] :谢谢大家的回答,绝对有帮助。正如我猜测的那样,没有简单的方法可以通过使用正则表达式来完成,并且需要/更容易进行数字比较。实际上,由于我在解释我的第一个想法时遇到了一些困难,所以我提出了十六进制示例,因为它是数字\d 和字母数字\w 字符的混合,我告诉自己我可以将解决方案扩展到字母 [F-Z] 如果解决方案作为正则表达式出现。但是我根本没有想到你会使用十六进制函数来转换它,因为我一直在寻找正则表达式!对于我的错误解释,我深表歉意。

但是您的解决方案仍然非常有用,因为我刚刚通过将十六进制转换函数替换为自定义函数来实现一些工作,我将所有字符都转换为 [0-9][A-Z]到它们的 ASCII 值和一些加权系数(例如 GV03 必须大于 G0V3)。再次感谢大家的帮助!!

最佳答案

调查以下代码是否符合您的要求

  • 将十六进制范围定义为二元数组
  • 定义匹配正则表达式
  • 将十六进制范围转换为等效整数
  • 遍历输入数据
  • 过滤匹配的行
  • 将匹配的十六进制值转换为整数
  • 将数字与感兴趣的范围进行比较
  • 如果数字满足定义范围则输出行
use strict;
use warnings;
use feature 'say';

my @range = qw(A0000000 A0003CFF);
my $match = qr/(A000([\d[a-f]){4})/i;

@range = map { hex } @range;

while( <DATA> ) {
chomp;
if( /$match/ ) {
my $n = hex($1);
say if $n >= $range[0] && $n <= $range[1];
}
}

__DATA__
This number is A0000000 must be printed
But B0001234 should not be printed
Again A0001CCF must be printed
Once more A0002FFF must be printed
But C0010000 should not be printed

输出

This number is A0000000 must be printed
Again A0001CCF must be printed
Once more A0002FFF must be printed

关于regex - Perl正则表达式间隔匹配对应于十六进制数的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63620567/

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