在包含十六进制数的字符串中匹配第n个出现次数

时间:2017-08-30 09:31:14

标签: regex perl hex

我的字符串包含单词,十六进制和数字我希望匹配字符串中的数字但是当十六进制包含数字时,它将与我的数字对齐。

my $string = " aabb is = 35"; #where aabb is hex number  
my $string1 = " abc0 is = 75" ; #where abc0 is hex number
my (@val1) = $string =~ /(\d+)/g;
print "$val1[0]\n";
@val1 = $string1 =~ /(\d+)/g;
print " $val1[1]\n";

以上脚本可以获取我想要的=之后的数字,但我需要硬编码$val[0] $val1[1]来获取该数字。无论如何我能够通过忽略十六进制数来匹配数字,以防我不确定哪个数字将达到我想要的数字?所以我可以打印$val1来获取我想要的数字。

8/30更新,感谢Toto指出

将是第一个十六进制数包含所有数字1234的情况,并且我想要匹配的数字不一定是字符串中的最后一个字。我想要的号码不一定是第二个号码,但是会在=

之后

3 个答案:

答案 0 :(得分:1)

由于十六进制可能只包含数字(1234),因此无法通过格式区分这两个数字。

显示的字符串允许位置匹配(字符串结尾)或基于它前面的=

my ($num) = $string =~ /([0-9]+)$/;

my ($num) = $string =~ /=\s*([0-9]+)\b/;

或在字符串中使用其他“地标”,如果与显示的样本不同。

鉴于问题编辑中的澄清,上面的第二个例子是合适的。

原帖,评论之前(已编辑)

数字不会有字母(除非它涉及指数),所以使用字边界

my ($num) = $string =~ /\b([0-9]+)\b/;

表示(无符号)整数。

允许+/-和/或浮点格式

my ($num) = $string =~ /( [+-]? [0-9]+\.?[0-9]* )/x;

但请注意,这会遗漏一些用于数字的格式。来自核心Scalar::Utillooks_like_number更可靠,可以先更广泛匹配,然后使用它过滤列表。

您可以使用\d代替0-9,但这会匹配许多额外字符,除非它与/a修饰符一起使用,自5.14起可用。但请注意,/a具有比限制仅ASCII数字(\d)更广泛的效果。请参阅perlre(搜索/a)。

答案 1 :(得分:0)

只有当数字位于字符串末尾时,您才可以使用(\d+$)来匹配数字。

答案 2 :(得分:0)

怎么样?

这匹配字符串中存在的第二个数字:

while(<DATA>) {
    my ($dec) = $_ =~ /.+\b(\d+)\b/a;
    say $dec;
}

__END__
hex abc123 dec 456 blah
hex 123123 dec 789456 blah

<强>输出:

456
789456