在包含十六进制数的字符串中匹配第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
,也是我想比赛将没有必要在字符串中的最后一个字的数量的情况下。我想要的号码不需要第二个号码,但会在=
之后由于十六进制可能只包含数字(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::Util的looks_like_number
更可靠,并且可以首先更广泛地匹配,然后使用它过滤列表。
可以使用\d
代替0-9
但除非它与/a
改性剂,可用自5.14使用这种匹配许多额外的字符。但请注意,/a
比限制仅限ASCII的数字(\d
)具有更广泛的效果。见perlre(搜索/a
)。
感谢您的回答,那么我想我需要通过'=' – 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
什么' “1234 1234”',其中第一是十六进制? – Toto
@Toto,是的,他们将是这种情况,所以我混淆了如何将其分开 – Tim
你是否想要字符串中的第二个数字? – Toto