Разбор строки «rgb (x, x, x)» в цветовой объект - PullRequest
15 голосов
/ 30 сентября 2011

Есть ли эффективный способ / существующее решение для разбора строки "rgb (x, x, x)" [где x в этом случае 0-255] в цветной объект? [Я планирую использовать значения цвета, чтобы преобразовать их в шестнадцатеричный цветовой эквивалент.

Я бы предпочел, чтобы для этого была опция GWT. Я также понимаю, что было бы легко использовать что-то вроде Scanner.nextInt. Однако я искал более надежный способ получить эту информацию.

Ответы [ 4 ]

28 голосов
/ 30 сентября 2011

Насколько я знаю, нет ничего подобного этому встроенному в 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)"));  
3 голосов
/ 30 сентября 2011

Для тех, кто не понимает регулярные выражения:

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 голосов
/ 30 сентября 2011

Я все еще предпочитаю решение регулярных выражений (и проголосовал соответственно), но Camickr действительно подчеркивает, что регулярное выражение немного неясно, особенно для детей сегодня, которые не использовали Unix (когда это была мужская операционная система с толькоИнтерфейс командной строки - Booyah !!).Итак, вот решение высокого уровня, которое я предлагаю, не потому, что я думаю, что оно лучше, а потому, что оно служит примером того, как использовать некоторые изящные функции Гуавы:

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]
param: [888]

Это регулярное выражение без регулярного выражения.

Это оставлено читателю в качестве упражнения дляadd проверяет, что (a) «rgb» появляется в начале строки, (b) скобки сбалансированы и правильно расположены, и (c) возвращается правильное количество правильно отформатированных целых чисел rgb.

1 голос
/ 28 июля 2013

И форма 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...