将“rgb(x,x,x)”字符串解析为颜色对象

是否有一种有效的方法/现有解决方案将字符串“rgb(x,x,x)”[其中x在这种情况下为0-255]解析为颜色对象? [我打算使用颜色值将它们转换为hex颜色的方便。

我希望有一个GWT选项。 我也意识到使用像Scanner.nextInt这样的东西很容易。 但是我一直在寻找一种更可靠的方式来获取这些信息。

据我所知,没有像Java或GWT内置的那样。 你必须编写自己的方法代码:

public static Color parse(String input) { Pattern c = Pattern.compile("rgb *\\( *([0-9]+), *([0-9]+), *([0-9]+) *\\)"); Matcher m = c.matcher(input); if (m.matches()) { return new Color(Integer.valueOf(m.group(1)), // r Integer.valueOf(m.group(2)), // g Integer.valueOf(m.group(3))); // b } return null; } 

你可以像这样使用它

 // java.awt.Color[r=128,g=32,b=212] System.out.println(parse("rgb(128,32,212)")); // java.awt.Color[r=255,g=0,b=255] System.out.println(parse("rgb (255, 0, 255)")); // throws IllegalArgumentException: // Color parameter outside of expected range: Red Blue System.out.println(parse("rgb (256, 1, 300)")); 

对于那些不了解正则表达式的人:

 public class Test { public static void main(String args[]) throws Exception { String text = "rgb(255,0,0)"; String[] colors = text.substring(4, text.length() - 1 ).split(","); Color color = new Color( Integer.parseInt(colors[0].trim()), Integer.parseInt(colors[1].trim()), Integer.parseInt(colors[2].trim()) ); System.out.println( color ); } } 

编辑:我知道有人会评论错误检查。 我把它留给了海报。 这样做很容易处理:

 if (text.startsWith("rgb(") && text.endsWith(")")) // do the parsing if (colors.length == 3) // build and return the color return null; 

关键是你不需要乍看之下没人理解的复杂正则表达式。 添加错误条件是一项简单的任务。

我仍然更喜欢正则表达式解决方案(并相应投票),但camickr确实指出正则表达式有点模糊,特别是对于今天没有使用Unix的孩子(当它是一个只有命令行界面的男子气概的操作系统时) – Booyah !!)。 所以这是我提供的高级解决方案,不是因为我认为它更好,而是因为它作为如何使用一些漂亮的Guava函数的示例:

 package com.stevej; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; public class StackOverflowMain { public static void main(String[] args) { Splitter extractParams = Splitter.on("rgb").omitEmptyStrings().trimResults(); Splitter splitParams = Splitter.on(CharMatcher.anyOf("(),").or(CharMatcher.WHITESPACE)).omitEmptyStrings() .trimResults(); final String test1 = "rgb(11,44,88)"; System.out.println("test1"); for (String param : splitParams.split(Iterables.getOnlyElement(extractParams.split(test1)))) { System.out.println("param: [" + param + "]"); } final String test2 = "rgb ( 111, 444 , 888 )"; System.out.println("test2"); for (String param : splitParams.split(Iterables.getOnlyElement(extractParams.split(test2)))) { System.out.println("param: [" + param + "]"); } } } 

输出:

TEST1
参议员:[11]
参议员:[44]
参议员:[88]
TEST2
参议员:[111]
参议员:[444]
参议员:[888]

没有正则表达式的是regex-ee-ish。

作为练习,读者可以添加检查(a)“rgb”出现在字符串的开头,(b)括号是平衡和正确定位的,以及(c)正确格式的rgb整数的正确数量退回。

和C#forms:

 public static bool ParseRgb(string input, out Color color) { var regex = new Regex("rgb *\\( *([0-9]+), *([0-9]+), *([0-9]+) *\\)"); var m = regex.Match(input); if (m.Success) { color = Color.FromArgb(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value), int.Parse(m.Groups[3].Value)); return true; } color = new Color(); return false; }