我正在为这种字符串寻找一些正则表达式
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怎么样? 感谢
答案 0 :(得分: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*\\)$";
我正在开发一个供个人使用的库,所以我更喜欢使用正则表达式。我完全评论了代码。感谢您的提示!
答案 1 :(得分:5)
我可以为您看到两种解决方案。要么:
if
条件a)正则表达式
RGB \(\ S *(?:(\ d {1,3})\ S * ,?){3} \)
b)视觉描述
a)正则表达式
?RGB \(\ S *(:(:\ d {1,2} | 1 \ d \ d | 2(?:[0-4] \ d | 5 [0-5]))\ S * ,?){3} \)$
rdb(0,0,255)=> 确定强>
rdb(104,10,299)=>的 KO 强>
rdb(299,5,299)=>的 KO 强>
b)视觉描述
提示:
正则表达式允许整数介于0到359之间
\ d {1,2} | [1-2] \ d {2} | 3 [0-5] \ d
正则表达式允许整数介于0和100之间
\ d {1,2} | 100
作为一般经验法则,代码的可维护性更喜欢解决方案#1。 不参与正则表达式的开发人员会很快理解正在发生的事情。不要忘记对代码进行全面评论。
如果您更喜欢解决方案#2,那么请准备让开发人员具有正则表达式的良好背景,因为正则表达式很复杂。
答案 2 :(得分:1)
六角
/[\#]([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