2012-05-16 2 views
0

Я был бы очень признателен, если бы кто-то мог указать мне в правильном направлении. У меня есть массив «cArr», и внутри этого массива у меня есть 2 элемента. То, что я хотел бы сделать, это сопоставить «rgb (xx, xx, xx)» и нажать на массив «rgbArr»; Проблема, с которой я сталкиваюсь, связана с regEx.Соответствие Javascript "rgb (xx, xx, xx)" с регулярным выражением regEx?

Вот мой код:

var cArr = ["id0{shape:round,rgb(24,23,12)}","id1{shape:long,weight:heavy,rgb(20,20,20)}","id2{shape:elongated,weigth:light,rgb(15,24,8)}"]; 


for(var i=cArr.length -1; i>=0; i--) 
{ 
    if(cArr[i].match(matchColors)) 
    { 
    rgbArr.push(cArr[i]); 
    break; 
    } 
} 

console.log(rgbArr); 
+0

Образец регулярного выражения, соответствующий «rgb (24,23,12)», будет выглядеть как «rgb \\ (d +, d +, d + \\)», если принять десятичные значения. Не отправляйте ответ, потому что я не получаю ваш цикл, поскольку вы, кажется, имеете несколько значений rgb в одной строке и нажимаете целую строку ... вы используете палочку для совпадения только с определенной частью? Если это так, первое совпадение или все совпадения? –

+0

уточните свой вопрос: почему у вас есть перерыв? Вы хотите поймать только последний rgb (...)? Каким будет желаемый результат в примере? – Gavriel

+0

@EugeneRyabtsev, я хотел бы пробивать только согласованные детали. Поэтому, если массив имеет 5 элементов, и если у всех из них есть теги «rgb (xx, xx, xx)», я хотел бы скопировать только «rgb (xx, xx, xx)» в rgbArr. Спасибо. – Combustion007

ответ

1

Просьба уточнить ваш вопрос (кажется, мой комментарий выше), на некоторое время попробовать что-то вроде этого. (Но это не дает вам несколько цветов RGB в 1-ом элементе ...)

var matchColors=/.*?(rgb\([^)]*\)).*/; 

var cArr = ["id0{shape:round,rgb(24,23,12)},id1{shape:long,weight:heavy,rgb(20,20,20)}","id2{shape:elongated,weigth:light,rgb(15,24,8)}","sdf"]; 

var rgbArr=[]; 

for(var i=cArr.length -1; i>=0; i--) { 
    if(cArr[i].match(matchColors)) { 
     var x = cArr[i].replace(matchColors,"$1"); 
     rgbArr.push(x); 
//  break; 
    } 
} 

console.log(rgbArr);​ 
+0

Спасибо, что помогли мне. Я хотел бы скопировать все теги «rgb (xx, xx, xx)» из элементов «cArr» в «rgbArr». Поэтому, если массив «cArr» имеет 5 элементов, и если у всех из них есть теги «rgb (xx, xx, xx)», я хотел бы скопировать только «rgb (xx, xx, xx)» в rgbArr. Спасибо. – Combustion007

+0

ОК, так что решите :) Ваш исходный вопрос имел несколько rgb (...) в 1-м элементе, мой код не справляется с этим. Но теперь вы изменили вопрос. Поэтому, если вы знаете, что у каждого элемента будет не более 1 rgb(), тогда мой код делает то, о чем вы просите. – Gavriel

+0

спасибо. Я понял, что это опечатка, которую я не заметил до вашего запроса. Поэтому я исправил это. Это действительно помогает. Большое спасибо. – Combustion007

2

Я боролся с этим вопросом сегодня и имеют немного более упрощенное решение этого вопроса, который использует несколько иной Regular Выражение наряду с функцией JavaScripts сопоставляет (я завернул его в функции, так что мы можем использовать эту функцию при необходимости):

function parseRGB (string) { 
    var rgbRegex = /(rgb\([^)]*\))/gi; 
    var rgbArray = string.match(rgbRegex); 

    return rgbArray; 
} 

Теперь просто вызовите функцию со значением вы хотите проверить. Например.

parseRGB('-moz-linear-gradient(top, rgb(68, 68, 68), rgb(153, 153, 153))'); 

который будет возвращать следующий массив:

[ "rgb(68, 68, 68)", "rgb(153, 153, 153)" ] 

Несколько вещей, чтобы отметить:

  • Если нет RGB соответствий не найдено эта функция возвращает нуль.
  • Функция строки соответствия JavaScripts автоматически помещает все события в массив для вас. Он может принимать регулярное выражение в качестве параметра.
  • Это может обрабатывать несколько значений rgb, если они существуют в проверяемой строке.

Надеюсь, это поможет кому-то.

Смежные вопросы