从遵循此格式的输入:
rgb(49, 49, 50) or rgb(30,30,40)
我怎样才能得到一个只包含用逗号分隔的数字的字符串,例如:
49,49,50
在红宝石?我担心有时逗号后面可能会有空格。我该如何处理?
使用scan
您可以返回所有匹配项的数组。在这种情况下\d+
,匹配一个或多个数字。这将返回一个数组 ['12','23','34']
。然后你可以用逗号连接元素。
"rgb(12,23,34)".scan(/\d+/).join(",")
#=> "12,23,34"
扫描是你的朋友:
"rgb(12,23,34)".scan(/\d+/).join(',') # => "12,23,34"
又好又甜。
像这样(忽略里面的所有空格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
并将位于匹配组 1 到 3 中,B
可通过$1
、或返回的结果访问。在 Rubular 上尝试一下。$2
$3
更新:此解决方案与此处使用的解决方案之间的区别在于,此解决方案scan
验证输入并且如果输入不正确则不匹配。打字可能比scan
解决方案慢一点,时间长一点。因此scan
,当先验知道输入有效时,解决方案将是更好的选择。
你可以试试这个:
new_str = "rgb(49, 49, 50)".sub(/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/, '\1,\2,\3')
很快,您可以执行以下操作:
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
只是为了多样化,删除你不想要的字符:
"rgb(49, 49 , 50)".gsub(/[rgb() ]/, '')
=> "49,49,50"