【问题标题】:How to identify a given string is hex color format如何识别给定的字符串是十六进制颜色格式
【发布时间】:2010-12-10 19:36:33
【问题描述】:

我正在寻找一个正则表达式来验证 ASP.NET C# 中的十六进制颜色和
我也在寻找服务器端验证的代码。

例如:#CCCCCC

【问题讨论】:

    标签: regex colors


    【解决方案1】:

    注意:这仅限于验证,即接受有效的十六进制颜色。对于实际的解析,您不会从中得到各个部分。

    ^#(?:[0-9a-fA-F]{3}){1,2}$
    

    对于 ARGB:

    ^#(?:[0-9a-fA-F]{3,4}){1,2}$
    

    解剖:

    ^              anchor for start of string
    #              the literal #
    (              start of group
     ?:            indicate a non-capturing group that doesn't generate backreferences
     [0-9a-fA-F]   hexadecimal digit
     {3}           three times
    )              end of group
    {1,2}          repeat either once or twice
    $              anchor for end of string
    

    这将匹配可在 CSS 中使用的任意十六进制颜色值,例如 #91bf4a#f13

    【讨论】:

    • 我认为有效颜色是 3 * 1/2 组合...所以 /^#(?:[0-9a-fA-F]{1,2}){3}$/两种方式似乎都有效。
    • @MichaelDausmann:不,你的可以接受 3 到 6 个十六进制数字之间的任何内容。
    • @Joey 对逐步解释很有帮助。谢谢
    • 这个正则表达式在创建我的公司用于新开发人员入职的示例程序时非常有用。作为一名老派 Perl 程序员,看到一些年轻的开发人员在更现代的编程语言中发现了前瞻断言,我印象深刻。在其他几个人的提交中看到相同的正则表达式后,我终于决定用谷歌搜索,发现他们刚刚想出了如何搜索 SO ?
    • 处理 RGB 和 ARGB 的小修改:"^#(?:[0-9a-fA-F]{2}){3,4}$"
    【解决方案2】:

    与其他解决方案存在轻微分歧。我会说

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

    原因是它(正确地)捕获了单个 RGB 分量。另一个表达式将#112233 分成三个部分,'#' 112 233。语法实际上是'#' (RR GG BB) | (R G B)

    轻微的缺点是需要更多的回溯。解析 #CCC 时,您不知道第二个 C 是绿色组件,直到您到达字符串的末尾;解析#CCCCCC 时,您不知道第二个 C 仍然是红色组件的一部分,直到您看到第 4 个 C。

    【讨论】:

    • 这个正则表达式也会匹配 #1234 和 #12345。但是,只能有 3 位或 6 位。此 RE 允许 3 到 6 位之间的任何数字。如果您真的想捕获正确的结构,那么您必须使用#([1-9a-fA-F]{3}|[1-9a-fA-F]{6})。如果您想捕获单个颜色分量,它会变得更加复杂(您的建议也不会这样做)。
    • 对于纯粹的验证目的(即,一个值是否实际上是可能的和正确的),我发现查看字符串的表观结构而不是指定的结构更容易。至少在这种情况下,生成的 RE 更简单。
    • @MSalters 这仍然不太正确,因为它返回了 #FFFF 的最后 3 位数字的匹配项。添加一组额外的括号:^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$ 修复它。
    • 确实,| 没有括起来,所以它寻找的是^#FFFFFFFFFF$。固定。
    • ([0-9a-fA-F]{2}){3} 不等于 [0-9a-fA-F]{6}
    【解决方案3】:

    如果你也想接受命名颜色和 rgb(a,b,c) 的话。最后的“i”不区分大小写。

    HTML 颜色(#123,不接受 rgb)

    /^(#[a-f0-9]{6}|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i
    

    CSS 颜色(#123,接受 rgb)

    /^(#[a-f0-9]{6}|#[a-f0-9]{3}|rgb *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|rgba *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i
    

    【讨论】:

    • 但 html 支持更多颜色,例如 darkturquoise 、 lightgoldenrodyellow 等
    • @MendonAshwini 是的。其中有140个新的。您可以将它们全部写在正则表达式的末尾,由 | 分隔
    • 是的..我检查了drafts.csswg.org/css-color-4。但这是验证它的唯一方法吗? java有没有提供库?
    【解决方案4】:

    基于 MSalters 的回答,但防止不正确的匹配,以下工作

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

    或者对于可选的哈希 # 符号:

    ^#?(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$
    

    并且没有生成反向引用:

    ^#?(?:(?:[0-9a-fA-F]{2}){3}|(?:[0-9a-fA-F]){3})$
    

    【讨论】:

      【解决方案5】:

      所有答案都提到了 RGB 格式, 这是 ARGB 格式的正则表达式:

      ^#[0-9a-fA-F]{8}$|#[0-9a-fA-F]{6}$|#[0-9a-fA-F]{4}$|#[0-9a-fA-F]{3}$
      

      【讨论】:

        【解决方案6】:

        这应该匹配任何 #rgb#rgba#rrggbb#rrggbbaa 语法:

        /^#(?:(?:[\da-f]{3}){1,2}|(?:[\da-f]{4}){1,2})$/i
        

        分解:

        ^            // start of line
        #            // literal pound sign, followed by
        (?:          // either:
          (?:          // a non-capturing group of:
            [\da-f]{3}   // exactly 3 of: a single digit or a letter 'a'–'f'
          ){1,2}       // repeated exactly 1 or 2 times
        |            // or:
          (?:          // a non-capturing group of:
            [\da-f]{4}   // exactly 4 of: a single digit or a letter 'a'–'f'
          ){1,2}       // repeated exactly 1 or 2 times
        )
        $            // end of line
        i            // ignore case (let 'A'–'F' match 'a'–'f')
        

        注意上面的等价于这个语法,这是不正确的:

        /^#(?:[\da-f]{3,4}){1,2}$/i
        

        这将允许一组 3 后跟一组 4,例如 #1234567,这不是有效的十六进制颜色。

        【讨论】:

        • 感谢@chharvey 全面的所有可能性
        【解决方案7】:

        红宝石

        在 Ruby 中,您可以访问 \h(十六进制)字符类。您还必须更加注意行尾,因此 \A...\z 而不是更常见的 ^...$

        /\A#(\h{3}){1,2}\z/
        

        这将匹配 # 后面的 3 或 6 个十六进制字符。所以没有RGBA。尽管没有 i 标志,但它也不区分大小写。

        【讨论】:

        • 在 ruby​​ 中,你也有 /\H/ 匹配非十六进制字符,所以你只需要否定布尔值(正则表达式找到 0 个非六进制字符:它是有效的十六进制数)例如:!"FF000"[/\H/] # true , !"hello"[/\H/] # false
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 2022-07-08
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 2012-08-15
        相关资源
        最近更新 更多