Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Regex.IsMatch returns true when it shouldn't?

Tags:

c#

.net

regex

I'm attempting to match a string that can contain any number of numeric characters or a decimal point using the following regex:

([0-9.])*

Here's some C# code to test the regex:

Regex regex = new Regex("([0-9.])*");

if (!regex.IsMatch("a"))
    throw new Exception("No match.");

I expect the exception to be thrown here but it isn't - am I using the Regex incorrectly or is there an error in the pattern?

EDIT: I'd also like to match a blank string.

like image 687
James Cadd Avatar asked Jan 09 '11 22:01

James Cadd


1 Answers

The * quantifier means "match 0 or more". In your case, "a" returns 0 matches, so the regex still succeeds. You probably wanted:

([0-9.]+)

The + quantifier means "match 1 or more, so it fails on non-numeric inputs and returns no matches. A quick spin the regex tester shows:

input      result
-----      ------
[empty]    No matches
a          No matches
.          1 match: "."
20.15      1 match: "20.15"
1          1 match: "1"
1.1.1      1 match: "1.1.1"
20.        1 match: "20."

Looks like we have some false positives, let's revise the regex as such:

^([0-9]+(?:\.[0-9]+)?)$

Now we get:

input      result
-----      ------
[empty]    No matches
a          No matches
.          No matches
20.15      1 match: "20.15"
1          1 match: "1"
1.1.1      No matches: "1.1.1"
20.        No matches

Coolness.

like image 58
Juliet Avatar answered Sep 30 '22 00:09

Juliet