为什么Regex isMatch在它是真的时给出错误?

时间:2011-04-02 09:46:05

标签: c# regex

我有一段C#代码,可以将文本框字段验证为正数字

Regex isPositiveInt = new Regex("[^0-9]");
return !isPositiveInt.IsMatch(textbox1.Text)

我发现如果正则表达式匹配,它给出“假”,当它不匹配时,它给出“真”。所以我要添加一个“!”到返回值。这没有问题,但我觉得这是违反直觉的。有人可以解释为什么它会返回相反的结果吗?

6 个答案:

答案 0 :(得分:7)

^元字符在正则表达式中有两个含义 - 在单独使用时标记字符串的开头,并作为[^...]模式的一部分,意思是“不匹配任何一个[...]块中的字符“。我想也许你想要^[0-9],它将匹配任何以数字开头的字符串。它不会确保整个字符串是数字的,因为它只检查第一个字符,之后可能会发生任何事情。

如果你想确保你的字符串是数字的,那么只需要^\d+$即可。 \d[0-9]相同但更易于阅读,^$分别标记字符串的开头和结尾。

答案 1 :(得分:5)

[^0-9]将匹配数字的字符。

这是你想要的吗?

您确定不代表\d+吗?

你认为它是反向的,因为如果你只测试正数和负数,你将使用的唯一非数字字符将是“ - ”(负号)。所以它会匹配负号,因为它不是数字。因此,您会发现您的代码正好相反。

E.g。 “-987”(true:匹配负号),“123”(false:未找到非数字字符)

因此,事实是:您的代码反向工作。你的代码错了,做错了。只是你的输入是看起来像它正在反向工作。

答案 2 :(得分:2)

您的正则表达式是负集,因此它将匹配数字的字符串中的单个字符。

结果示例:

""     false
"0"    false
"1"    false
"x"    true
"42x"  true

您可以使用它来捕获输入中的非法字符,但正如您所见,您无法使用它来区分空输入和数字输入。

要仅匹配数字,您将匹配字符串的开头和结尾(使用^$),并且至少有一位数字:

Regex isNonNegativeInteger = new Regex(@"^\d+$");

要匹配一个正整数(我不确定你真正想要的那个),你必须确保该值不为零。这将匹配其中一个数字不为零的数字:

Regex isPositiveInteger = new Regex(@"^\d*[1-9]\d*$");

答案 3 :(得分:1)

正则表达式字符类中的^表示:不在09的集合中。要匹配您想要的正整数:

[0-9]+

表示0到9的一个或多个字符。

注意:这也将匹配0,严格来说,它不是正整数。该表达式实际上匹配非负整数。

答案 4 :(得分:0)

的真正答案
  

没有问题,但我觉得这是违反直觉的。有人可以解释为什么它会返回相反的结果吗?

确实是:它没有。看两次:)

另一方面:你的直觉仍然正常。你可以学会信任它。

对不起,如果这看起来有点迂腐,但它没有明确说明,我认为在某种程度上它应该是公认的答案。 我们试着回答这个问题。由于其他人在此之外已经有很多帮助,我不必重复这些信息:)

答案 5 :(得分:0)

我认为下面将填写您正在寻找的内容

这将检查没有小数的整数

\ A([0-9] *)\Ž

这甚至会识别十进制

\ A([0-9]的)\Ž| \ A(\ d (\ d)*)\Ž