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

问题描述:

我有包含字,十六进制和数字的字符串我想匹配字符串中的数字,但是当十六进制数字包含数字时,它将与我的数字网格化。在包含十六进制数的字符串中匹配第n个出现号码

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更新,感谢托托指出

将是第一个十六进制数包含所有数字1234,也是我想比赛将没有必要在字符串中的最后一个字的数量的情况下。我想要的号码不需要第二个号码,但会在=

+0

什么' “1234 1234”',其中第一是十六进制? – Toto

+0

@Toto,是的,他们将是这种情况,所以我混淆了如何将其分开 – Tim

+0

你是否想要字符串中的第二个数字? – Toto

之后由于十六进制可能只包含数字(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)。

+0

感谢您的回答,那么我想我需要通过'=' – Tim

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

怎么样?

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

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

__END__ 
hex abc123 dec 456 blah 
hex 123123 dec 789456 blah 

输出:

456 
789456