re = /(?(DEFINE)
(?<decimal>(?(int)([.][0-9]+)?|[.][0-9]+))
(?<percentage>
(100|
(?<int>([0-9]|[1-9][0-9]))? # Have integer be optional (0-100 only)
(?P>decimal) # Have decimal required when an integer is not included
)
(?<symbol>%)
)
(?<hue>
(?<int>36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])? # Have integer be optional
(?P>decimal) # Have decimal required when an integer is not included
(?<symbol>\s*deg\s*)?
)
(?<alpha>
(?(alpha),\s*(
1[.]0|
(?<int>0)? # Have integer be optional
(?P>decimal) # Have decimal required when integer is not incldue
)\s*)
)
(?<hsl>\s*(?P>hue)\s*,\s*(?P>percentage)\s*,\s*(?P>percentage)\s*)
)
hsl(?<alpha>a)?\((?P>hsl)(?P>alpha)\)/xi
str = 'hsl(10, 50deg, 150%)
HSLA(50.35, .531, 10%)
HSLA(50.5deg, .531%, .9%, 1.0)'
# Print the match result
str.scan(re) do |match|
puts match.to_s
end
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html