【发布时间】:2019-04-25 19:40:55
【问题描述】:
如何创建检测文本中十六进制数字的正则表达式?
例如,“0x0f4”、“0acdadecf822eeff32aca5830e438cb54aa722e3”和“8BADF00D”。
【问题讨论】:
-
正则表达式并没有真正解析。尝试提取所有类似数字的内容并筛选出不是十六进制的内容。
标签: regex
如何创建检测文本中十六进制数字的正则表达式?
例如,“0x0f4”、“0acdadecf822eeff32aca5830e438cb54aa722e3”和“8BADF00D”。
【问题讨论】:
标签: regex
下面的呢?
0[xX][0-9a-fA-F]+
匹配以 0 开头,后跟小写或大写 x,后跟 0-9、a-f 或 A-F 范围内的一个或多个字符的表达式
【讨论】:
/0x[\da-f]/i,否则,+1。
确切的语法取决于您的确切要求和编程语言,但基本上:
/[0-9a-fA-F]+/
或更简单地说,i 使其不区分大小写。
/[0-9a-f]+/i
如果你有幸使用 Ruby,你可以这样做:
/\h+/
编辑 - Steven Schroeder 的回答让我意识到我对 0x 位的理解是错误的,因此我相应地更新了我的建议。 如果你还想匹配 0x,等价物是
/0[xX][0-9a-fA-F]+/
/0x[0-9a-f]+/i
/0x[\h]+/i
添加更多 - 如果 0x 需要是可选的(正如问题所暗示的那样):
/(0x)?[0-9a-f]+/i
【讨论】:
没什么大不了的,但是大多数正则表达式引擎都支持 POSIX 字符类,并且有 [:xdigit:] 用于匹配十六进制字符,这比常见的 0-9a-fA-F 更简单。
因此,请求的正则表达式(即带有可选的0x)是:/(0x)?[[:xdigit:]]+/
【讨论】:
值得一提的是,可以通过以下方式检测 MD5(这是示例之一):
[0-9a-fA-F]{32}
【讨论】:
这将匹配有或没有 0x 前缀
(?:0[xX])?[0-9a-fA-F]+
【讨论】:
如果你使用 Perl 或 PHP,你可以替换
[0-9a-fA-F]
与:
[[:xdigit:]]
【讨论】:
为了记录,我会指定以下内容:
/^[xX]?[0-9a-fA-F]{6}$/
不同之处在于它检查它是否有包含六个有效字符,如果我们有一个,则在小写或大写 x 上。
【讨论】:
如果您要在字符串中间查找特定的十六进制字符,您可以使用“\xhh”,其中 hh 是十六进制字符。我试过了,它有效。我使用 C++ Qt 框架,但它可以解决其他情况下的问题,这取决于您需要使用的风格(php、javascript、python、golang 等)。
【讨论】:
\x相当于其他语言的\u。
另一个示例:css 颜色的十六进制值以井号或井号 (#) 开头,然后是六个字符,可以是 A 和 F 之间的数字或字母。
^#[0-9a-fA-F]{6}
【讨论】:
这个确保你有不超过三个有效对:
(([a-fA-F]|[0-9]){2}){3}
任何多于或少于三对有效字符都不匹配。
【讨论】:
在 Java 中这是允许的:
(?:0x?)?[\p{XDigit}]+$
如您所见,0x 在非捕获组中是可选的(甚至 x 也是可选的)。
【讨论】:
如果您在输入中需要此功能,用户也可以输入 0 和 0x,但不能输入没有 0x 前缀的十六进制数字:
^0?[xX]?[0-9a-fA-F]*$
【讨论】:
x 不带前导 0。您应该将它们分组,以确保您不会在没有0 的情况下获得x。所以在示例中应该是^(?:0[xX]?)?[0-9a-fA-F]*$。