C#Regex.IsMatch在不应该返回时返回true?

时间:2011-01-09 22:32:33

标签: c# .net regex silverlight

我正在尝试使用以下正则表达式匹配包含任意数量的数字字符或小数点的字符串:

([0-9.])*

以下是测试正则表达式的一些C#代码:

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

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

我希望在这里抛出异常,但事实并非如此 - 我是否正确使用正则表达式或模式中是否有错误?

编辑:我还想匹配一个空白字符串。

3 个答案:

答案 0 :(得分:11)

*量词表示“匹配0或更多”。在你的情况下,“a”返回0匹配,所以正则表达式仍然成功。你可能想要:

([0-9.]+)

+量词表示“匹配1或更多,因此它在非数字输入上失败并且不返回任何匹配。快速旋转regex tester显示:

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."

看起来我们有一些误报,让我们修改正则表达式:

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

现在我们得到:

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

凉意。

答案 1 :(得分:8)

您应该使用+而不是*

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

这应该可以正常工作。

使用*时,任何字符串都可以匹配此模式。

答案 2 :(得分:8)

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

这是因为该群组可以匹配 ZERO 或更多次。

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