仅限数字的正则表达式

时间:2008-11-07 18:42:50

标签: c# regex .net-2.0

我根本没有使用正则表达式,所以我很难排除故障。我希望正则表达式只在包含的字符串是所有数字时匹配;但是下面的两个例子是匹配一个包含所有数字的字符串加上一个等号“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。

18 个答案:

答案 0 :(得分:431)

使用开始和结束锚点。

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

如果您需要匹配多个数字,请使用"^\d+$"


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


如果您需要包含除数字之外的任何数字表示(如初学者的十进制值),请参阅@tchristcomprehensive guide to parsing numbers with regular expressions

答案 1 :(得分:90)

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

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

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

答案 2 :(得分:33)

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

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

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

答案 3 :(得分:17)

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

^\d+$

答案 4 :(得分:15)

也许我的方法会帮助你。

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

答案 5 :(得分:13)

这适用于整数和十进制数。如果数字具有彗差千位分隔符,则不匹配,

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

与此匹配的一些字符串:

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

一些没有的字符串:

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

答案 6 :(得分:11)

^ \ d + $,这是“字符串的开头”,“1位或更多位”,“字符串的结尾”,英文。

答案 7 :(得分: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

答案 8 :(得分:8)

抱歉丑陋的格式化。 对于任意数量的数字:

[0-9]*

对于一个或多个数字:

[0-9]+

答案 9 :(得分:8)

如果您需要检查所有数字是否都是数字(0-9),

^[0-9]+$

1425 TRUE

0142 TRUE

0 TRUE

1 TRUE

154a25 FALSE

1234 = 3254 FALSE

答案 10 :(得分:4)

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

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

要匹配文字句点字符使用:

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

答案 11 :(得分:3)

使用开始和结束锚点。

 Regex regex = new Regex(@"^\d$");
 Use "^\d+$" if you need to match more than one digit.

答案 12 :(得分:3)

虽然上述解决方案中没有一个符合我的目的,但这对我有用。

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

有效值的示例: " 3&#34 ;, " -3&#34 ;, " 0&#34 ;, " 0.0&#34 ;, " 1.0&#34 ;, " 0.7&#34 ;, " 690.7&#34 ;, " 0.0001&#34 ;, " -555&#34 ;, " 945465464654"

无效值的示例: "&#34 ;, "&#34 ;, " &#34 ;, "&#34 ;, " - &#34 ;, " 001&#34 ;, " 00.2&#34 ;, " 000.5&#34 ;, " 0.3&#34 ;, " 3&#34 ;, " -1&#34 ;, " - 1&#34 ;, " - 1&#34 ;, " -0&#34 ;, " 00099&#34 ;, " 099"

答案 13 :(得分:2)

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

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

答案 14 :(得分:1)

如果您只想从字符串中提取数字,则“\ d +”模式应该有所帮助。

答案 15 :(得分:1)

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

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

一个数字可以以句点开头(没有前导数字), 并且数字可以以句点结尾(没有尾随数字)。 以上正则表达式将识别为正确的数字。 一个 。 (句号)本身没有任何数字不是正确的数字。 这就是为什么我们需要两个正则表达式部分(用" |"分开)。

希望这有帮助。

答案 16 :(得分:0)

 console.log(/^(0|[1-9][0-9]*)$/.test(3000)) // true

答案 17 :(得分:0)

以下正则表达式仅接受英语和阿拉伯语(波斯语)语言(就像 Windows 计算器)中的数字(也是浮点数):

^((([0\u0660\u06F0]|([1-9\u0661-\u0669\u06F1-\u06F9][0\u0660\u06F0]*?)+)(\.)[0-9\u0660-\u0669\u06F0-\u06F9]*)|(([0\u0660\u06F0]?|([1-9\u0661-\u0669\u06F1-\u06F9][0\u0660\u06F0]*?)+))|\b)$

以上正则表达式接受以下模式:

11
1.2
0.3
۱۲
۱.۳
۰.۲
۲.۷

以上正则表达式不接受以下模式:

3.
.3
0..3
.۱۲