6

我正在为这种字符串寻找一些正则表达式

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

和:

r,g,b integer included between 0 and 255, 
a float between 0 and 1 (truncated to first digit after the point)
h integer included between 0 and 359
s,l integer included between 0 and 100

对于 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,299,299) 这样的字符串。我怎样才能使它更有效?那么rgba,hsl和hsla呢?谢谢

4

3 回答 3

7

最后我写了这些正则表达式:

    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*\\)$";

我正在开发一个供我个人使用的库,所以我更喜欢使用正则表达式。我完全注释了代码。感谢您的提示!

于 2012-09-17T10:20:05.390 回答
6

我可以为您看到两种解决方案。任何一个 :

1.从输入中提取数字,然后用if条件检查它们

a) 正则表达式

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

b) 视觉描述

用于解析 RGB 值的简单正则表达式

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

a) 正则表达式

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

rdb(0,0,255) => OK
rdb(104,10,299) => KO
rdb(299,5,299) => KO

b) 视觉描述

用于解析 RGB 值的更健壮的正则表达式


尖端 :

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

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

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

    \d{1,2}|100

结论

作为一般经验法则,为了代码的可维护性,更喜欢解决方案#1。不涉及正则表达式的开发人员会很快理解发生了什么。不要忘记完整地注释代码。

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

于 2012-09-13T12:30:09.697 回答
2

十六进制

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

RGB

/[Rr][Gg][Bb][\(](((([\d]{1,3})[\,]{0,1})[\s]*){3})[\)]/gm

RGBA

/[Rr][Gg][Bb][Aa][\(](((([\d]{1,3}|[\d\.]{1,3})[\,]{0,1})[\s]*){4})[\)]/gm

HSL

/[Hh][Ss][Ll][\(](((([\d]{1,3}|[\d\%]{2,4})[\,]{0,1})[\s]*){3})[\)]/gm

HSLA

/[Hh][Ss][Ll][Aa][\(](((([\d]{1,3}|[\d\%]{2,4}|[\d\.]{1,3})[\,]{0,1})[\s]*){4})[\)]/gm
于 2016-05-22T10:01:29.750 回答