正则表达式仅用于数字


309

我根本没有使用过正则表达式,因此我在排除故障方面遇到困难。我希望正则表达式仅在包含的字符串为全数字时才匹配;但在下面的两个示例中,它匹配包含所有数字和等号的字符串,例如“ 1234 = 4321”。我敢肯定有一种方法可以改变这种行为,但是正如我所说,我从未真正对正则表达式做过很多事情。

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

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

if (regex.IsMatch(compare))
{ 
    //true
}

万一重要,我使用的是C#和.NET2.0。


6
您需要匹配数字还是数字?例如:123.456是一个数字,但不是全数字。
Joel Coehoorn

确实,OP尚不清楚是否要使用整数
Sune Rievers 2009年

3
为什么不为这种简单情况尝试使用TryParse字符串呢?bool decimal.TryParse(字符串,输出小数结果)或bool int.TryParse(字符串,输出小数结果)
Makach 2010年

查看此答案,以明确地解析带有正则表达式的数字。
tchrist

1
通常,我认为,解决Regex表达式最简单的方法是,如果您的语言允许,则使用命令行解释器(大多数情况下似乎可以这样做)。由于此示例在C#中,因此可以使用linqpad.net,也可以在调试器中使用断点,然后将VS中的Instant窗口用作CLI。
andrew

Answers:


478

使用开始和结束锚点。

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

使用"^\d+$",如果你需要匹配一个以上的数字。


请注意,"\d"它将[0-9]与其他数字字符匹配,例如东部阿拉伯数字٠١٢٣٤٥٦٧٨٩。用于"^[0-9]+$"将匹配限制为仅阿拉伯数字0-9。


如果您需要包括除数字以外的任何数字表示形式(例如入门的十进制值),请参阅@tchrist综合指南,以正则表达式解析数字


一定数量的数值怎么样?对于某些国家(例如印度)的邮政编码来说通常是这样。我想我们可能需要在此之后进行字符串长度检查吗?
Najeeb

2
@Najeeb是的,由于印度邮政编码是6位数字,因此您可以使用"^\d{6}$"。其他一些国家/地区的邮政编码规则更为复杂,因此针对多个国家/地区的正则表达式解决方案也可能变得非常复杂。在stackoverflow.com/q/578406/1288上
Bill the Lizard

如果输入字符串仍然像“ 3 a”那样仍然匹配,那又如何呢?有谁知道我只有在有数字的情况下才能使它匹配,而没有别的什么(我想是负号除外)。我目前已将其设置为“-?[0-9] +”。
马修(Matthew)

105

您的正则表达式将匹配包含数字的任何内容,您想使用锚点匹配整个字符串,然后匹配一个或多个数字:

regex = new Regex("^[0-9]+$");

^将锚定字符串的开始,$将锚定字符串的结尾,而+将匹配一个或多个(在这种情况下的数字)什么它之前。


38

如果需要容忍小数点和千位标记

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

如果数字可以为负,则需要一个“-”。


@弗洛林·吉塔 谢谢。“-”必须在开头。
安迪

3
此正则表达式还错误地允许前导负号(-)和句号(.)出现多次。
DavidRR 2014年

5
您可以通过制作-.可选?-?\d+(?:\.\d+)?将匹配整数或小数。(?:
原谅中的原谅

2
对于像1..5这样的边缘情况,它会失败,但是如果您对此进行监督的话。对于-2这样的基本情况,它仍然失败。请对其进行更改^-?[0-9][0-9,\.]*$以避免基本情况失败。+替换为*
PrivateOmega

我在这里缺少的一种情况是工程符号(1.2345e-4)对此有何建议?
WolfiG

18

之所以匹配,是因为找到的不是整个字符串的匹配项。您可以通过更改正则表达式以专门查找字符串的开头和结尾来解决此问题。

^\d+$

16

也许我的方法会对您有所帮助。

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
请记住,尽管Char.IsDigit返回true的是UnicodeCategory.DecimalDigitNumber类别的成员的任何字符。这可能不是OP想要的。另请参见为什么Char.IsDigit对于无法解析为int的char返回true?
DavidRR 2014年


16

这适用于整数和十进制数。如果数字带有逗号分隔符,则不匹配,

"^-?\\d*(\\.\\d+)?$"

与此匹配的一些字符串:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

一些没有的字符串:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.



10

这是我的工作对象:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

和一些测试

正面测试:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

阴性测试:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

不仅检查了C#,还检查了Java,Javascript和PHP


“ .3”,“ 3”。实际上是个好数字(分别表示0.3和3.0)。我们一直在源代码系统中看到这种情况,并且您提到的大多数语言的to_number(xx)函数都会正确识别并转换它们。谢谢。
塔加

1
@Ruslan是正确的,在许多系统中“ .3”,“ 3”。将解析为有效数字,并按照您提到的“ 0.3”和“ 3.0”使用。但另一方面-这是转换后的值,因此原始值为“ .3”和“ 3”。不是真正存在的数字。
Marina K.

9

抱歉,格式化不正确。对于任意数字:

[0-9]*

对于一位或多位数字:

[0-9]+

7

尽管上述解决方案都不适合我的目的,但是这对我有用。

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

有效值的示例:“ 3”,“-3”,“ 0”,“ 0.0”,“ 1.0”,“ 0.7”,“ 690.7”,“ 0.0001”,“-555”,“ 945465464654”

无效值的示例:“ a”,“”,“”,“。”,“-”,“ 001”,“ 00.2”,“ 000.5”,“。3”,“ 3。”,“-1” ,“-1”,“-。1”,“-0”,“ 00099”,“ 099”


4

另一种方法:如果您想匹配波斯或阿拉伯等国际号码,则可以使用以下表达式:

Regex = new Regex(@"^[\p{N}]+$");

要匹配文字字符,请使用:

Regex = new Regex(@"^[\p{N}\.]+$");


3

用于整数和浮点数的正则表达式:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

数字可以以句点开头(没有前导数字),而数字可以以句点结尾(没有尾随数字)。上面的正则表达式会将两者都识别为正确的数字。

一个 。(句号)本身没有任何数字不是正确的数字。这就是为什么我们在那里需要两个正则表达式部分(以“ |”分隔)的原因。

希望这可以帮助。


1
这是最完整的解决方案。恭喜!
Renato Medeiros

2

我认为这是最简单的一种,它接受欧洲和美国的数字书写方式,例如美国10,555.12欧洲的10.555,12另外,此一不允许多个逗号或点号一个接一个地接一个,例如10..22或10,.22除此数字外,还会通过.55或.55。这可能很方便。

^([,|.]?[0-9])+$


-4

正则表达式正则表达式=新正则表达式(“ ^ [0-9] {1,4} = [0-9] {1,4] $”)


5
你能解释一下你的答案吗?您会注意到,该问题的其他答案对正则表达式的每个部分做什么都有一定程度的解释,而您所缺少的。
李慧夏
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.