java 将“rgb (x, x, x)”字符串解析为颜色对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7613996/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Parsing a "rgb (x, x, x)" String Into a Color Object
提问by monksy
Is there an effecient way/existing solution for parsing the string "rgb (x, x, x)" [where x in this case is 0-255] into a color object? [I'm planning to use the color values to convert them into the hex color equivilience.
是否有一种有效的方法/现有解决方案可以将字符串“rgb (x, x, x)” [在这种情况下 x 为 0-255] 解析为颜色对象?[我打算使用颜色值将它们转换为十六进制颜色等价。
I would prefer there to be a GWT option for this. I also realize that it would be easy to use something like Scanner.nextInt. However I was looking for a more reliable manner to get this information.
我希望有一个 GWT 选项。我也意识到使用 Scanner.nextInt 之类的东西会很容易。但是,我正在寻找一种更可靠的方式来获取此信息。
回答by Confluence
As far as I know there's nothing like this built-in to Java or GWT. You'll have to code your own method:
据我所知,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;
}
You can use that like this
你可以这样使用
// 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)"));
回答by camickr
For those of use who don't understand regex:
对于那些不了解正则表达式的人:
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 );
}
}
Edit: I knew someone would comment on error checking. I was leaving that up to the poster. It is easily handled by doing:
编辑:我知道有人会评论错误检查。我把它留给海报。可以通过以下方式轻松处理:
if (text.startsWith("rgb(") && text.endsWith(")"))
// do the parsing
if (colors.length == 3)
// build and return the color
return null;
The point is your don't need a complicated regex that nobody understands at first glance. Adding error conditions is a simple task.
关键是您不需要乍一看没人理解的复杂正则表达式。添加错误条件是一项简单的任务。
回答by Steve J
I still prefer the regex solution (and voted accordingly) but camickr does make a point that regex is a bit obscure, especially to kids today who haven't used Unix (when it was a manly-man's operating system with only a command line interface -- Booyah!!). So here is a high-level solution that I'm offering up, not because I think it's better, but because it acts as an example of how to use some the nifty Guava functions:
我仍然更喜欢正则表达式解决方案(并相应地投票)但 camickr 确实指出正则表达式有点晦涩,尤其是对于今天没有使用过 Unix 的孩子(当时它是一个只有命令行界面的男子气概的操作系统) ——呜呜!!)。所以这是我提供的一个高级解决方案,不是因为我认为它更好,而是因为它作为如何使用一些漂亮的 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 + "]");
}
}
}
Output:
输出:
test1
param: [11]
param: [44]
param: [88]
test2
param: [111]
param: [444]
param: [888]
TEST1
PARAM:[11]
PARAM:[44]
PARAM:[88]
TEST2
PARAM:[111]
PARAM:[444]
PARAM:[888]
It's regex-ee-ish without the regex.
它是没有正则表达式的 regex-ee-ish。
It is left as an exercise to the reader to add checks that (a) "rgb" appears in the beginning of the string, (b) the parentheses are balanced and correctly positioned, and (c) the correct number of correctly formatted rgb integers are returned.
留给读者作为练习添加检查 (a) "rgb" 出现在字符串的开头,(b) 括号是否平衡且位置正确,以及 (c) 格式正确的 rgb 整数的正确数量被退回。
回答by EliSherer
And the C# form:
和 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;
}