2013-10-24 2 views
0

От входа, который имеет следующий формат:Получить RgB значения из строки, как RGB (49, 49, 50)

rgb(49, 49, 50) or rgb(30,30,40) 

Как я могу получить строку, которая будет содержать только цифры, разделенные запятыми, например as:

49,49,50 

В Ruby? Меня беспокоит случай, что иногда после запятой может быть пробел. Как я могу с этим справиться?

ответ

3

Scan является вашим другом:

"rgb(12,23,34)".scan(/\d+/).join(',') # => "12,23,34" 

Приятный и сладкий.

1

Подобно этому (игнорирует все пробелы внутри rgb():

if "rgb(49, 49, 50)" =~ /rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ 
    [$1, $2, $3].join "," 
end 
#=> "49,49,50" 

R, G и B будет в матче групп с 1 по 3, доступные через $1, $2, $3 или возвращенного результата Try it out on Rubular

..

Обновление: Разница между этим решением и теми, которые используют scan здесь, что это на e проверяет ввод и не будет соответствовать, если вход неверен. Вероятно, это немного медленнее и длиннее, чем решение scan. Таким образом, решение scan было бы лучшим выбором, когда априори известно, что тогда ввод действителен.

0

Вы можете попробовать это:

new_str = "rgb(49, 49, 50)".sub(/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/, '\1,\2,\3') 
0

Очень быстро, вы могли бы сделать что-то вроде этого:

s1 = "rgb(30,30,40)" 
s2 = "rgb(30, 30, 40)" 

r = /rgb\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3})\)/ 

m = r.match(s1) 
puts "#{m[1]},#{m[2]},#{m[3]}" => 30,30,40 

m = r.match(s2) 
puts "#{m[1]},#{m[2]},#{m[3]}" => 30,30,40 
3

Использование scan вы можете вернуть массив всех матчей. В этом случае \d+ соответствует одной или нескольким цифрам. Это возвращает массив ['12','23','34']. Затем вы можете присоединиться к элементам с запятыми.

"rgb(12,23,34)".scan(/\d+/).join(",") 
#=> "12,23,34" 
0

Просто для разнообразия, удалить символы, которые вы не хотите:

"rgb(49, 49 , 50)".gsub(/[rgb() ]/, '') 
=> "49,49,50" 
Смежные вопросы