Home > Back-end >  JavaScript - Regex with decimal values
JavaScript - Regex with decimal values

Time:10-30

I am trying to create a regular expression that validates an red/green/blue value expression. The expressions that I need my regular expression to match include:

  1. rgb(1, 10, 100)
  2. rgb(100, 10, 1)
  3. rgb(1,2,3)
  4. rgba(1, 2, 3, .75)
  5. rgba(1, 2, 3, 0.75)
  6. rgba(1, 2, 3, 0)
  7. rgba(1, 2, 3, 1)

Currently, I have the following regular expression:

^rgba?\((([ -]?\d (\.\d )?),\s*){2}[ -]?\d (\.\d )?(,\s*(0?\.\d|[01]))?\)$

This expression works for #1, #2, #3, #6, and #7. However, it fails for #4 and #5. I keep staring at the last group. To me, it looks like it should accept a decimal. Clearly, it's not though. What am I doing wrong?

CodePudding user response:

The problem in your regular expression, is that your expression doesn't allow for values greater than length 1 behind the last decimal point. Considering the original regular expession:

^rgba?\((([ -]?\d (\.\d )?),\s*){2}[ -]?\d (\.\d )?(,\s*(0?\.\d|[01]))?\)$

You will get a positive value for rgba(1, 2, 35.132, 0.7), but negative for rgba(1, 2, 35.132, 0.75).

The solution is adding a star to the last \d digit denotator, indicating that there can be any amount of digits. A plus would be even better, as it would detect faulty values that have 0 digits behind a decimal point, by requiring at least 1 of the \d instance.

^rgba?\((([ -]?\d (\.\d )?),\s*){2}[ -]?\d (\.\d )?(,\s*(0?\.\d*|[01]))?\)$

Hope this helps you out!

  • Related