【问题标题】:Regular expression for a hexadecimal number?十六进制数的正则表达式?
【发布时间】:2019-04-25 19:40:55
【问题描述】:

如何创建检测文本中十六进制数字的正则表达式?

例如,“0x0f4”、“0acdadecf822eeff32aca5830e438cb54aa722e3”和“8BADF00D”。

【问题讨论】:

  • 正则表达式并没有真正解析。尝试提取所有类似数字的内容并筛选出不是十六进制的内容。

标签: regex


【解决方案1】:

下面的呢?

0[xX][0-9a-fA-F]+

匹配以 0 开头,后跟小写或大写 x,后跟 0-9、a-f 或 A-F 范围内的一个或多个字符的表达式

【讨论】:

  • 这可以简写为/0x[\da-f]/i,否则,+1。
  • @NiklasB。您的速记仅在使用 perl 正则表达式时有效,如果使用 POSIX 正则表达式,那么 Steven 的解决方案是最短的。无论哪种方式,Steven 的解决方案都适用于 perl 和 POSIX 正则表达式。
  • 知道了!如果十六进制数以 0x 或 0X 开头,Steven 的解决方案很好。这个应该更好用:^[0-9A-F]+$ 它还可以识别十六进制模式,例如:'535GH0G73' 对于 Java,我们可以使用例如 String.matches() 来检查这个.. 谢谢大家的回复:)
  • '0x[\da-f]{2}' 最好也限制数量
  • 与第二个和第三个示例数字 0acdadecf822eeff32aca5830e438cb54aa722e3 和 8BADF00D 匹配吗?
【解决方案2】:

确切的语法取决于您的确切要求和编程语言,但基本上:

/[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

【讨论】:

  • 你能解释一下上述RE的原因吗?
  • @noobDroid 你希望我具体解释什么?
【解决方案3】:

没什么大不了的,但是大多数正则表达式引擎都支持 POSIX 字符类,并且有 [:xdigit:] 用于匹配十六进制字符,这比常见的 0-9a-fA-F 更简单。

因此,请求的正则表达式(即带有可选的0x)是:/(0x)?[[:xdigit:]]+/

【讨论】:

  • 不幸的是,不是 powershell 或 .net。
【解决方案4】:

值得一提的是,可以通过以下方式检测 MD5(这是示例之一):

[0-9a-fA-F]{32}

【讨论】:

    【解决方案5】:

    这将匹配有或没有 0x 前缀

    (?:0[xX])?[0-9a-fA-F]+

    【讨论】:

      【解决方案6】:

      如果你使用 Perl 或 PHP,你可以替换

      [0-9a-fA-F]
      

      与:

      [[:xdigit:]]
      

      【讨论】:

      • 这应该是一个独立的答案。
      • 自 2014 年起已被 this answer 覆盖。
      【解决方案7】:

      为了记录,我会指定以下内容:

      /^[xX]?[0-9a-fA-F]{6}$/
      

      不同之处在于它检查它是否包含六个有效字符,如果我们有一个,则在小写或大写 x 上。

      【讨论】:

        【解决方案8】:

        如果您要在字符串中间查找特定的十六进制字符,您可以使用“\xhh”,其中 hh 是十六进制字符。我试过了,它有效。我使用 C++ Qt 框架,但它可以解决其他情况下的问题,这取决于您需要使用的风格(php、javascript、python、golang 等)。

        此答案来自:http://ult-tex.net/info/perl/

        【讨论】:

        • 嘿!虽然这对于 perl 可能是正确的,但似乎并非所有编程语言中的正则表达式都是如此。根据this\x相当于其他语言的\u
        【解决方案9】:

        另一个示例:css 颜色的十六进制值以井号或井号 (#) 开头,然后是六个字符,可以是 A 和 F 之间的数字或字母。

        ^#[0-9a-fA-F]{6}
        

        【讨论】:

          【解决方案10】:

          这个确保你有不超过三个有效对:

          (([a-fA-F]|[0-9]){2}){3}
          

          任何多于或少于三对有效字符都不匹配。

          【讨论】:

            【解决方案11】:

            在 Java 中这是允许的:

            (?:0x?)?[\p{XDigit}]+$
            

            如您所见,0x 在非捕获组中是可选的(甚至 x 也是可选的)。

            【讨论】:

              【解决方案12】:

              如果您在输入中需要此功能,用户也可以输入 00x,但不能输入没有 0x 前缀的十六进制数字:

              ^0?[xX]?[0-9a-fA-F]*$
              

              【讨论】:

              • 使用此解决方案,您允许 x 不带前导 0。您应该将它们分组,以确保您不会在没有0 的情况下获得x。所以在示例中应该是^(?:0[xX]?)?[0-9a-fA-F]*$
              猜你喜欢
              • 2014-03-05
              • 1970-01-01
              • 2011-10-03
              • 2017-02-27
              • 1970-01-01
              • 2012-07-12
              • 2010-10-20
              • 2021-06-04
              相关资源
              最近更新 更多