如何创建检测文本中十六进制数的正则表达式?
例如,‘0x0f4’、‘0acdadecf822eeff32aca5830e438cb54aa722e3’和‘8BADF00D’。
下面这些怎么样?
0[xX][0-9a-fA-F]+
匹配以0开头的表达式,后跟小写或大写的 x,后跟范围0-9、 A-F 或 A-F 中的一个或多个字符
确切的语法取决于您的确切需求和编程语言,但基本上:
/[0-9a-fA-F]+/
或者更简单地说,i使其不区分大小写。
i
/[0-9a-f]+/i
如果你有幸使用 Ruby,你可以这样做:
/\h+/
斯蒂芬 · 施罗德的回答让我意识到我对0x 位的理解是错误的,所以我相应地更新了我的建议。 如果还希望匹配0x,则等效项为
/0[xX][0-9a-fA-F]+/ /0x[0-9a-f]+/i /0x[\h]+/i
附加更多 -如果0x 需要是可选的(正如问题所暗示的) :
/(0x)?[0-9a-f]+/i
这将匹配有或没有 0x前缀
0x
(?:0[xX])?[0-9a-fA-F]+
这没什么大不了的,但是大多数正则表达式引擎都支持 POSIX 字符类,而且还有用于匹配十六进制字符的 [:xdigit:],这比通常的 0-9a-fA-F要简单。
[:xdigit:]
0-9a-fA-F
因此,所请求的正则表达式(即带有可选 0x的正则表达式)是: /(0x)?[[:xdigit:]]+/
/(0x)?[[:xdigit:]]+/
值得一提的是,检测 MD5(这是一个例子)可以使用以下方法:
[0-9a-fA-F]{32}
这个选项确保你的有效对数不超过三对:
(([a-fA-F]|[0-9]){2}){3}
多于或少于三对有效字符无法匹配。
如果使用 Perl 或 PHP,则可以替换
[0-9a-fA-F]
与:
[[:xdigit:]]
为了记录在案,我要说明以下几点:
/^[xX]?[0-9a-fA-F]{6}$/
不同之处在于,它检查 有是否包含6个有效字符,如果有一个,则检查小写或大写的 x。
如果要在字符串中间查找特定的十六进制字符,可以使用“ xhh”,其中 hh 是十六进制字符。我试过了,很管用。我使用 C + + Qt 框架,但是它可以在其他情况下解决问题,这取决于您需要使用的风格(php、 javascript、 python、 golang 等)。
答案取自: http://ult-tex.net/info/perl/
如果你需要在一个输入中输入 0和 0x,而不是没有 0x前缀的十六进制数字:
0
^0?[xX]?[0-9a-fA-F]*$
另一个例子: css 颜色的十六进制值以一个磅号或哈希(#)开始,然后六个字符既可以是数字,也可以是 A 和 F 之间的字母,包括在内。
^#[0-9a-fA-F]{6}
在 Java 中,这是允许的:
(?:0x?)?[\p{XDigit}]+$
如您所见,在非捕获组中,0x是可选的(甚至 x也是可选的)。
x
首先,使用 \b代替 ^和 $,因为它是一个单词分隔符,当散列不是行中唯一的字符串时可以提供帮助。
\b
^
$
我来这里寻找类似但专门的正则表达式,并得到了这个:
\b(\d+[a-f]+\d+[\da-f]*|[a-f]+\d+[a-f]+[\da-f]*)\b
我需要在控制台中检测像 git 提交标识符(和类似的)这样的散列,然后再匹配所有可能的散列。我优先选择 没有,匹配随机单词或数字,如 EB或 12345678
EB
12345678
所以我做的一个启发式的方法是,我假设一个散列将在数字和字母之间交替合理经常和链只有数字或只有字母将是短的。
另一个重要的事实是,MD5哈希是32个字符长(如@Adaddcrazy 所提到的) ,git 显示一个只有10个字符的缩短版本,因此上面的例子可以修改如下:
对于10个字符长的散列,我假设组最多为3个字符长
\b(\d+[a-f]+\d+[\da-f]{1,7}|[a-f]+\d+[a-f]+[\da-f]{1,7})\b
对于长达32个字符的散列,我假设这些组最多只有5个字符长
\b(\d+[a-f]+\d+[\da-f]{17,29}|[a-f]+\d+[a-f]+[\da-f]{17,29})\b
你可以很容易地改变 a-f到 a-fA-F的大小写不敏感性或添加 0[xX]在前面的 0x前缀匹配
a-f
a-fA-F
0[xX]
这些例子显然不会匹配奇异但有效的哈希,有非常长的序列只有数字或只有字母在前面或极端的哈希像只有 0 但这样我可以匹配散列和减少事故假阳性匹配显着,如 dir 名称或行号