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

时间:2011-09-30 17:38:57

标签: java gwt colors

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

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

4 个答案:

答案 0 :(得分:28)

据我所知,没有像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)"));  

答案 1 :(得分:3)

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

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;

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

答案 2 :(得分:2)

我仍然更喜欢正则表达式解决方案(并相应投票),但是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
param:[11]
param:[44]
param:[88]
test2
param:[111]
param :[444]
param:[888]

没有正则表达式的是正则表达式。

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

答案 3 :(得分:1)

和C#形式:

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;
}