Java Rgb、Rgba、Hsl、Hsla颜色编码的正则表达式模式

Java Rgb、Rgba、Hsl、Hsla颜色编码的正则表达式模式,java,regex,Java,Regex,我在找这种字符串的正则表达式 rgb(r,g,b) rgba(r,g,b,a) hsl(h,s%,l%) hsla(h,s%,l%,a) 与: 对于rgb,我编写了以下正则表达式: rgb\(\s*((?:[0-2]?[0-9])?[0-9])\s*,\s*((?:[0-2]?[0-9])?[0-9])\s*,\s*((?:[0-2]?[0-9])?[0-9])\s*\)$ 它可以工作,但也允许像rgb(299)这样的字符串。 我怎样才能使它更有效? rgba、hsl和hsla呢? 谢谢我可

我在找这种字符串的正则表达式

rgb(r,g,b)
rgba(r,g,b,a)
hsl(h,s%,l%)
hsla(h,s%,l%,a)
与:

对于rgb,我编写了以下正则表达式:

rgb\(\s*((?:[0-2]?[0-9])?[0-9])\s*,\s*((?:[0-2]?[0-9])?[0-9])\s*,\s*((?:[0-2]?[0-9])?[0-9])\s*\)$
它可以工作,但也允许像rgb(299)这样的字符串。 我怎样才能使它更有效? rgba、hsl和hsla呢?
谢谢

我可以为您找到两种解决方案。要么:

1.从输入中提取数字,然后使用
if
条件进行检查 a)正则表达式

rgb\(\s*(?:(\d{1,3})\s*,?){3}\)

b)视觉描述

2.构建一个(相当复杂的)正则表达式来直接检查输入 a)正则表达式

rgb \(\s*(?:(?:\d{1,2}| 1\d\d|2(?[0-4]\d|5[0-5]))\s*,?){3}$

rdb(0,0255)=>OK
rdb(104,10299)=>KO
rdb(299,5299)=>KO

b)视觉描述


提示:

  • 允许包含0到359之间的整数的正则表达式

    \d{1,2}|[1-2]\d{2}|3[0-5]\d

  • 允许包含0到100之间的整数的正则表达式

    \d{1,2}| 100

结论 作为一般经验法则,对于代码的可维护性首选解决方案#1。 不参与正则表达式的开发人员会很快理解所发生的事情。不要忘记对代码进行完整的注释


如果您更喜欢解决方案#2,那么请准备好让具有良好正则表达式背景的开发人员使用正则表达式,因为正则表达式非常复杂。

最后,我编写了以下正则表达式:

    String keywords_color_regex = "^[a-z]*$";
    String hex_color_regex = "^#[0-9a-f]{3}([0-9a-f]{3})?$";
    String rgb_color_regex = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*\\)$";
    String rgba_color_regex = "^rgba\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*((0.[1-9])|[01])\\s*\\)$";
    String hsl_color_regex = "^hsl\\(\\s*(0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*\\)$";
我正在开发一个供我个人使用的库,所以我更喜欢使用正则表达式。我对代码进行了完整的注释。谢谢你的提示

Hex

/[\#]([a-fA-F\d]{6}|[a-fA-F\d]{3})/gm
RGB

RGBA

HSL

HSLA


=>不要使用正则表达式验证某个数字是否在某个范围内……这是:@AntonioGiovanniSchiavone More,用于可读性和维护。你更喜欢哪一个:
^(0-1-9]\d?\d\d?| 2[0-4]\d | 25[0-5])$
如果数字>=0和0-255之间的整数的数字似乎有效:^(0-1-9]\d?| 1\d\d?| 2[0-4]\d | 25[0-5])$对于介于0和1之间的浮点值:^(0[1-9])[01$@Antoniovanionnione“快”一词可能更重要。1.我不认为regex会更快。如果是这样的话,差异将是几毫秒(如果不是更少的话),因此几乎不明显,即使您运行该代码数百万次……如果您需要它,请在javascript中检查此项,您的rgba_color_regex匹配的
(0.[1-9])|[01])
,应该是
(0.[0-9]*)|[01])
允许alpha值,例如0.05或0.74。否则很好,谢谢!您还可以复制“rgba”正则表达式末尾的
,\\s*((0.[1-9])|[01])\\s*\
部分,并附加到“hsl”的末尾以生成一个新的“hsla”行。@Safareli您忽略了一个事实,即在JS中(由于CSS),RGB值可以在
%
中定义,如
RGB(100%,50%,90%)
请注意,RGB和RGBA中可能有一个负数。浏览器会将其剪裁为0,但它仍然不会通过正则表达式。无论如何,这种兽交不应该出现在代码中:)我知道这是一篇老文章,但我正要将一个问题标记为重复,直到我看到你在正则表达式中选择逗号,允许匹配
rgb(112233)
这些都是非常错误的。
/[\#]([a-fA-F\d]{6}|[a-fA-F\d]{3})/gm
/[Rr][Gg][Bb][\(](((([\d]{1,3})[\,]{0,1})[\s]*){3})[\)]/gm
/[Rr][Gg][Bb][Aa][\(](((([\d]{1,3}|[\d\.]{1,3})[\,]{0,1})[\s]*){4})[\)]/gm
/[Hh][Ss][Ll][\(](((([\d]{1,3}|[\d\%]{2,4})[\,]{0,1})[\s]*){3})[\)]/gm
/[Hh][Ss][Ll][Aa][\(](((([\d]{1,3}|[\d\%]{2,4}|[\d\.]{1,3})[\,]{0,1})[\s]*){4})[\)]/gm