开发者

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

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 reg开发者_如何学JAVAex:

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.


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.


Regex.IsMatch("a", "([0-9.])*") // true

This is because the group can match ZERO or more times.

Regex.IsMatch("a", "([0-9.])+") // false


You should use + instead of *

Regex reg = new Regex("([0-9.])+");

This should work fine.

When you use * any string can match this pattern in your case.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜