模式只匹配非模糊的十六进制数字(不是十进制数字)

时间:2016-05-23 15:17:23

标签: python regex perl

我们都熟悉十六进制数的正则表达式,但是什么是一个聪明的正则表达式,只匹配非模糊的十六进制数但不匹配整数(基数为10 /十进制)。实例

  • 1f345 = MATCH
  • 0f123 = MATCH
  • 12340 = NO MATCH(模糊小数,可以是十六进制或十进制)
  • 01234 = NO MATCH(技术上也不是整数)

它似乎需要两个正则表达式。首先匹配十六进制数(和整数)然后匹配至少一个[a-f][A-F]的结果。但是有更简单的方法吗?

应用此方法是将非模糊十六进制数字批量替换为其转换后的十进制版本,同时保留不明确的数字。

3 个答案:

答案 0 :(得分:5)

正如我上面评论的那样,除非你的输入数据在十进制和十六进制数字之间有进一步的区别,否则不可能(不可能)找出哪些数字是十六进制的。

虽然十六进制数字允许超出阿拉伯数字0-9的额外数字,但仅由这些数字形成的数字也是有效的十六进制数字,如果它是十进制表示,则具有与相同数字不同的值。

这就是为什么允许存在十进制和十六进制数字的所有编程语言(和数据文件)(以及其他可能的基数,如八进制和二进制)都有不同的标记。例如,在C和从C派生的语言中,使用前缀“0x”,因此任何人都可以发现0x1234和1234之间的差异。

如果你真的有输入数据混合这两个数字基础,你必须退后一步,找出一种方法来告诉哪个数字意味着什么,可能作为其他一些上下文的一部分。如果没有这样的上下文并且无法重新生成您的输入数据,您也可以放弃您想要实现的任何内容。

更新 - 当问题文本以其他形式编写时,此文本已被写入,并且理解真实意图并不容易。现在问题很清楚了 - 我会保留答案,因为对于初学者尝试一种神奇的方式从十进制中指出十六进制而没有任何额外的标记可能是一个好建议。

答案 1 :(得分:3)

至少需要一个十六进制数字,两边用零或更多的十六进制或十进制数字括起来。

[0-9]*[a-f][0-9a-f]*

更新了@AdrianHHH建议的优化。

答案 2 :(得分:2)

我不知道这可能有用,但你可以使用

/^[0-9]*[a-fA-F][0-9a-fA-F]*\z/
相关问题