WedX - журнал о программировании и компьютерных науках

Регулярное выражение Javascript для значений RGB

Я пытаюсь получить отдельные значения строки RGB. Я был близок, но я просто врезался в стену. Я хочу сделать что-то вроде этого:

var color = rgb(255, 85, 120);

/// My Regex ///
var rRegex = /^rgb\(\d{3}/;  // Which actually gives me an array of two strings...ugh
var gRegex = ;
var bRegex = ;

var r = color.match(rRegex);
var g = color.match(gRegex);
var b = color.match(bRegex);

Я просто хочу иметь:

/// // I think I can pull these off by Starts With and Ends With anchors... ///
r = 'From "(" to "," ';
g = 'From "," to "," ';
b = 'From "," to ")" ';

Я также пытаюсь сделать так, чтобы регулярное выражение могло принимать 1, 2 или 3 числа, так как значения идут от 0 до 255. Спасибо за любую помощь!

06.03.2012

  • Этот, похоже, сработал лучше всего, спасибо, Орблинг! 06.03.2012
  • САМОЕ КРАТКОЕ РЕШЕНИЕ: "rgb(1, 23, 156)".match(/\d+/g); // ["1", "23", "156"] см. @pimvdb ответ 13.01.2019

Ответы:


1

Вот пример кода, который должен делать примерно то, что вам нужно, или направлять вас в правильном направлении:

var color = 'rgb(255, 15, 120)';
var matchColors = /rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)/;
var match = matchColors.exec(color);
if (match !== null) {
    document.write('Red: ' + match[1] + ' Green: ' + match[2] + ' Blue: ' + match[3]);
}

Вы можете увидеть это в действии здесь: https://jsfiddle.net/xonev/dRk8d/

06.03.2012
  • Не перестает удивлять. Спасибо, Стивен, все сработало отлично! И всем остальным спасибо за безумно быстрые ответы. 06.03.2012
  • Я использовал этот код, но использовал регулярное выражение Орблинга. Почему-то это работало лучше. Я не уверен, почему. Иногда ваше регулярное выражение не работало, создавая ноль. Все еще удивительная помощь, спасибо! 06.03.2012
  • Различия между моим регулярным выражением и регулярным выражением Орблинга заключаются в следующем: Орблинг требует, чтобы определение цвета было единственным в строке (у него есть теги привязки, которые соответствуют началу и концу строки), Орблинг допускает числа с более чем 3 цифрами (мой позволяет только 1, 2 или 3 цифры), а Orbling не допускает пробелов. В остальном они очень похожи. регулярное выражение arc может быть на самом деле самым общим - оно допускает любые пробелы (или их отсутствие) между отдельными числами, запятыми и т. д. 06.03.2012
  • @Strongwings: Какое регулярное выражение вам нужно для вашей ситуации, зависит от изменчивости того, что, вероятно, придет. Мое регулярное выражение предполагало, что это будет очень религиозно строка формы "rgb(#,#,#)", без пробелов, без пробелов, просто три числа, завернутые в rgb(...) бит. Версия Стивена требует пробелов после каждой запятой и не более 3 цифр, а также допускает другое содержимое в строке. Я подозреваю, что пробелы - это проблема с вашим вводом и его регулярным выражением. версия дуги допускает любой уровень расстояния между точками. Просто выберите самый простой из них, соответствующий изменчивости вашей ситуации. 06.03.2012
  • Работает, за исключением того, что такие значения, как rgb(999, 999, 999), пройдут тест. Если вас беспокоят ошибки с этими значениями, я бы еще раз проверил значения, которые вы получили. 15.03.2017

  • 2

    Я придумал этот "^(rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$", который может проверять целую кучу вариантов строк, включая:

    • RGB(255 255 255)
    • RGB(255, 255, 255) RGB(0/0/0)
    • RGB(50-50-50)
    • RGB(0 - 0 - 0)
    • RGB(255,0-50)
    • RGB(0, 255 255)
    • RGB( 0 0 0 )
    • 255,255,255
    • 255, 255, 0
    • (0, 0, 30)
    • (255 - 255 - 255)
    • RGB0 0 0
    • rgb255 - 0/255
    01.12.2015
  • Это потрясающе! Как бы вы добавили к нему RGB %s? 02.02.2019

  • 3

    Попробуйте это регулярное выражение:

    /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/
    

    Он зафиксирует значение r в 1 доллар, значение g в 2 доллара и значение b в 3 доллара.

    06.03.2012

    4

    Если строка является допустимой в формате rgb, разбор чисел сводится к сопоставлению цифр:

    "rgb(12, 34, 56)".match(/\d+/g); // ["12", "34", "56"]
    
    06.03.2012
  • @yckart: это глобальное регулярное выражение, поэтому вам нужно .exec несколько раз. Каждый запуск вы получите следующий матч. В этом случае: var regexp = /\d+/g; var r = regexp.exec(str)[0]; var g = regexp.exec(str)[0]; var b = regexp.exec(str)[0];. 22.11.2012

  • 5

    Попробуй это. Регулярное выражение в диапазоне от 0 до 255.

    rgb\((( *0*([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]) *),){2}( *0*([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]) *)\)
    

    Визуализация регулярных выражений

    Демонстрация отладки

    26.04.2016

    6

    Я использую этот: rgb\(\s*(?:(?:\d{1,2}|1\d\d|2(?:[0-4]\d|5[0-5]))\s*,?){3}\)$

    • префикс rgb
    • в конце имеем {3} значит будем проверять условия снизу 3 раза

    • \d{1,2} если значение внутри имеет только 1 или 2 символа - проверить, есть ли цифры

    • 1\d\d если значение внутри имеет 3 цифры и первая равна 1 а остальные цифры

    • 2(?:[0-4]\d|5[0-5]) if value inside have 3 digits and first one is equals to 2 then
      • ?:[0-4]\d if second symbol is in range of 0-4 the third one should any digit
      • 5[0-5] если второй символ равен 5 то третий символ должен быть цифрой из диапазона 0-5
    07.12.2016

    7
    function rgb(value) {
      if (typeof value !== 'string') {
        return false;
      }
    
      return value.match(new RegExp('^rgb\\((25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?|[0-9]), ?(25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?|[0-9]), ?(25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?|[0-9])\\)$')) !== null;
    }
    
    function rgba(value) {
      if (typeof value !== 'string') {
        return false;
      }
    
      return value.match(new RegExp('^rgba\\((25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?|[0-9]), ?(25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?|[0-9]), ?(25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?|[0-9]), ?(1|0|0\.[0-9]+)\\)$')) !== null;
    }
    

    Примеры:

    'rgb(255,255,255)' // true
    'rgb(255, 255,255)' // true
    'rgb(255, 255, 255)' // true
    'rgb(0,0,0)' // true
    'rgb(255,255,255)' // true
    'rgb(256,255,255)' // false, min: 0, max: 255
    'rgb(01,1,1)' // false, zero is not accepted on the left, except when the value was exactly 0 (here 0 != 00)
    
    16.03.2019
  • Вы должны объяснить, почему вы создаете такое сложное регулярное выражение. Кроме того, rgb(01,1,1) и rgb(256,255,255) являются допустимым синтаксисом в соответствии со стандартом css. 16.03.2019
  • В примерах я обнаружил, что меня беспокоит принятие любого символа с \ d {1,3} (001 или 999). Я ограничил первый случай, потому что нули не нужны, и я ограничил второй, потому что в настоящее время мне нужно только подняться до 255. Мой код - просто более ограничительная версия. 28.03.2019
  • 'rgb(255, 255, 255)' // true ‹ — это возвращает false. ваше регулярное выражение не проверяет наличие пробелов 26.07.2019

  • 8
    ^(\\d{1,2}|[1][0-9][0-9]|[2][0-5][0-5]);(\\d{1,2}|[1][0-9][0-9]|[2][0-5][0-5]);(\\d{1,2}|[1][0-9][0-9]|[2][0-5][0-5])$ 
    

    формат x;x;x, где x — число от 0 (включительно) до 255 (включено)

    13.05.2014
  • Это не позволит 249 или подобные значения. Допускается 250 и 255, но не 2[0-5]{6,7,8,9}. 14.05.2014

  • 9

    Машинописное решение:

    interface RGB {
      r: number,
      g: number,
      b: number
    }
    
    const str2rgb = (color: string): RGB => {
      const rgbSubset = color
        .split('(')
        .pop()
        ?.split(')')
        .shift()
        ?.split(',')
        .slice(0, 3)
        .map(Number);
    
      if (rgbSubset && rgbSubset.length === 3) {
        const [r, g, b] = rgbSubset;
        return {r, g, b};
      }
    
      throw new Error(`Invalid color = ${color}`);
    };
    
    
    15.05.2020
  • Пожалуйста, воздержитесь от ответа только кодом, см. Как ответить. Всегда помните, что вы отвечаете не только на OP, но и на любых будущих читателей (особенно при ответе на вопрос 8-летней давности), поэтому edit сообщение должно содержать некоторое объяснение того, почему это работает. 15.05.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]