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

Jam*_*add 3 .net c# regex silverlight

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

([0-9.])*
Run Code Online (Sandbox Code Playgroud)

这里有一些C#代码来测试正则表达式:

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

if (!regex.IsMatch("a"))
    throw new Exception("No match.");
Run Code Online (Sandbox Code Playgroud)

我希望在这里抛出异常,但它不是 - 我是否正确使用正则表达式或模式中是否有错误?

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

Jul*_*iet 10

*量词意为"匹配0或更多个".在你的情况下,"a"返回0匹配,所以正则表达式仍然成功.你可能想要:

([0-9.]+)
Run Code Online (Sandbox Code Playgroud)

+量词意为"匹配1个或更多,所以在非数字输入失败,并返回没有匹配的快速自旋的.正则表达式测试仪显示:

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."
Run Code Online (Sandbox Code Playgroud)

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

^([0-9]+(?:\.[0-9]+)?)$
Run Code Online (Sandbox Code Playgroud)

现在我们得到:

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
Run Code Online (Sandbox Code Playgroud)

凉意.

  • @James Cadd:是的.`^((:[0-9] +(:\ [0-9] +))|\S*?.?)$`.但为了保持你的正则表达式简单,你应该使用`str ==""|| IsMatch(...)`. (2认同)
  • 哦,最后一个想法,如果可能,您应该避免使用正则表达式。您可能无法在正则表达式中考虑一些细微差别,例如全球化。`.` 不是通用的十进制分隔符,当前形式的正则表达式不考虑 1000s 分隔符。如果可能,请考虑使用 `decimal.TryParse`。 (2认同)

小智 8

你应该使用+而不是*

Regex reg = new Regex("([0-9.])+");
Run Code Online (Sandbox Code Playgroud)

这应该工作正常.

当你使用*时,任何字符串都可以匹配你的情况.


小智 8

Regex.IsMatch("a", "([0-9.])*") // true
Run Code Online (Sandbox Code Playgroud)

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

Regex.IsMatch("a", "([0-9.])+") // false
Run Code Online (Sandbox Code Playgroud)