2011-01-09 54 views
2

我试图匹配可以包含使用下面的正则表达式任意数目的数字字符或小数点的字符串:C#Regex.IsMatch在不应该的时候返回true。

([0-9.])* 

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

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

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

我期望在这里抛出异常,但它不是 - 我正确使用Regex还是模式中有错误?

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

+1

尝试转义小数点。我相信RegEx认为它是“任何角色”。 – 2011-01-09 22:36:21

回答

9

*量词意为 “匹配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 

凉爽。

+0

感谢*几乎*它 - 谢谢!我的意图与“零或更多”是我还想接受一个空白字符串。有没有办法将它添加到你建议的正则表达式中? – 2011-01-09 22:48:28

6

您应该使用+而不是*

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

这应该很好地工作。

当你使用*任何字符串可以匹配你的情况下这种模式。

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

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

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

这实际上是正确的答案。正如朱丽叶指出的那样,在角色类中。被视为文字 – Rob 2011-01-09 22:46:33

相关问题