tags:

views:

92

answers:

5

I need help with a regex matching a number. I need up to 3 digits after the dot (.):

12345    ok
12       ok
12.1     ok
12.12    ok
12.123   ok
12.1234  Error
1.123456 Error

how to do it? Thanks in advance.

+3  A: 
^\d+(\.\d{1,3})?$
polygenelubricants
A: 
regex.match(@"\d+\.\d{,3}"};
rerun
Is `{,3}` valid in .NET's regex syntax? But even if it is, it will validate numbers like `12.`, something the OP didn't mention (might be correct, but probably isn't).
Bart Kiers
This doesn't match just `12345`, which according to OP should be OK.
polygenelubricants
+3  A: 

You can try:

^\d+|(\d+\.\d{1,3})$
  • \d - Single digit
  • \d+ - one or more digits, that is a number.
  • \. - dot is a metachar..so to match a literal dot, you'll need to escape it.
  • {1,3} - between 1 to 3 (both inclusive) repetitions of the previous thing.
  • ^ and $ - Anchors so that we match entire thing not just part of something.
codaddict
+6  A: 
\d+(?:\.\d{1,3})?

Explanation:

\d+        # multiple digits
(?:        # start non-capturing group  
  \.       # a dot
  \d{1,3}  # 1-3 digits
)?         # end non-capturing group, made optional
Tomalak
+1 for nice explanation
dboarman
+1  A: 

Are you sure you need regex to solve the problem you are having? How about:

bool ContainsAtMostThreeNumbersAfterDot(string str)
{
  int dotIndex = str.IndexOf(".");
  float f;
  return float.TryParse(str, out f) && str.Length - dotIndex < 3;
}

This code is nor complete or 100% correct (take is just as an idea and handle the specific cases yourself), but IMHO, it expresses the intent a lot more clearly than using a regex to solve a problem that does not need regex at all.

Marek
`/\d+(?:\.\d{1,3})?/` reads pretty clearly to me...
macek
...reads clearly to anyone knowing regex. Does not express intent at all for anyone not familiar with regular expressions and is an overkill of the strength of regular expressions for a problem that has a much easier and readable solution.
Marek
How is this an overkill? To those who knows regex, this application falls perfectly on the sweet spot of the language. And you can't possibly be serious about your solution being easier and more readable. I don't even know what `TryParse` does without looking up the API.
polygenelubricants