正则表达式:仅接受数字。第一个字符不能为0。

41
我有一个使用.NET创建的文本框。
通过使用该文本框,用户只能输入数字。但是不能以0开头,只能以1-9开头。在用户在第一个字符键入1-9后,用户可以键入0。
Regex reg = null;
reg = new System.Text.RegularExpressions.Regex("^[1-9][0-9]*$")
return reg.IsMatch(str);

这是我的正则表达式。使用它,我不能输入1-9,只能输入0和字母。 但是如果我使用^[1-9],我可以输入数字,但无法输入0。
我已经尝试了所有你们提出的答案。但仍然无法解决问题。并不是我没有阅读你们的所有答案。
这是图片。

enter image description here

我希望在第一次验证时,用户只能输入数字,但必须以非0或字母而是1-9的值开头。在第一个字符之后,用户只能输入0-9。

我使用Int.TryParse进行验证,但我是在按下按钮处理后才使用它。

reg = new System.Text.RegularExpressions.Regex("^[^0-9]");

这个正则表达式只接受从0到9的数字。
reg = new System.Text.RegularExpressions.Regex("^[^1-9]");

该正则表达式仅接受数字1到9。

如何向正则表达式添加更多的表达式,以使第二个字符到其余部分仅接受数字0-9?

顺便说一下,我不关心0.99,因为在这里价格是固定的,不是0.99或0.123等。

还有其他方法吗?谢谢。


有任何正则表达式可以开始吗?或者 ^($|[^0]) 是一个可接受的解决方案吗? - John Dvorak
你在原问题中没有说“仅限数字”。 - John Dvorak
1
Alfred,请记住,0.99是一个完全有效的(由于应用商店而广泛使用)价格。 - paxdiablo
嗨paxdiablo,感谢您的信息。但这是一个文本框。我想验证用户不能输入以0开头的数字,而是以1-9开头。在第一个字符之后,他们可以输入0-9。有什么办法可以做到这一点吗? - Alfred Angkasa
Alfred,已经有3个很好的答案了。为什么不阅读它们呢? - Shiplu Mokaddim
显示剩余6条评论
7个回答

55
如果您正在查看价格等内容,需要考虑到 0.99 可能是完全有效的。对于这种情况,我会从一个非复杂的正则表达式 ^[0-9]*(\.[0-9]{0,2})?$ 开始(当然还有可能出现一些例如小数点后有三个数字等特殊情况需要更复杂的表达式),并且允许前导零,因为它们不会以任何方式“损坏”价值。
如果必须以非零数开头,只需将初始的[0-9]* 改成 [1-9][0-9]*。 对于仅限整数的情况(根据您添加的示例数据似乎是这样),如下所示:
^[1-9][0-9]*$

26

要匹配以任何数字开头但不是零的数字:

^[1-9][0-9]*$

如果您也想匹配0:

^([1-9][0-9]*)|([0]+)$

如果您只想得到一个零,请去掉最后一个加号。

要允许在第一个非零数字之后输入任何字母或数字:

^[1-9a-zA-Z][0-9a-zA-Z]*$

@JanDvorak 什么时候 OP 说孤零零的零也要匹配? - Shiplu Mokaddim
@perreal在第一次修订中没有提到数字。 - John Dvorak
@AlfredAngkasa “允许字母” - 什么意思?你想要接受字母吗?这个程序不会接受字母。 - John Dvorak
是的,我知道。但在这里仍然可以输入字母。我只想要数字,但不以0开头。我已经尝试过^[1-9][0-9]*$,但仍然可以输入字母。为什么我要对你们所有人撒谎,说这仍然可以允许呢? - Alfred Angkasa
@AlfredAngkasa,也许你遇到的问题不是正则表达式,而是你使用的语言/工具。该工具不应允许任何与你的正则表达式不匹配的内容。 - perreal
显示剩余6条评论

4

以下是对我来说最有效的方法:

^(?!(0))[0-9]+$

这仅适用于单个数字字符,例如 1、2、3,但不适用于 100、200、300 等等。 - Pwnstar
谢谢,我使用这个正则表达式 (?!0)\d+ - a55

1

由于您的代码是.NET,因此不应使用正则表达式解析整数。只需使用UInt32.TryParse()方法即可。

uint num=0;
if(UInt32.TryParse(str, out num)){
    Console.WriteLine("Converted '{0}' to {1}.", str, num);   
}else{
    Console.WriteLine("conversion of '{0}' failed.", value==null? "": value);
}

老的答案

这个简单的正则表达式可以实现 ^[1-9]\d*$


空字符串怎么办?这将拒绝空字符串。 - John Dvorak
OP没有提到这件事。 - Shiplu Mokaddim
但是如果用户输入0123556呢?因为用户不能在第一个字符输入0。我该怎么处理?谢谢... - Alfred Angkasa
“0”有什么问题吗?它仍然是一个有效的数字。在使用“TryParse”后,它将被转换为“123556”。 - Shiplu Mokaddim
嗨,我刚刚上传了一张图片以便更清楚地说明。第一次,每当用户在文本框中输入值时,用户只能输入所有数字但不能以0开头。如果我输入0123456然后点击按钮,我会使用Int.TryParse进行转换... - Alfred Angkasa
我认为你的代码还有其他问题。^[1-9]\d*$ 已经足够了。它可以匹配 11210。实际上至少需要一个数字,但是首位数字不能是 0 - Shiplu Mokaddim

1

这个正则表达式接受数字0-9,不允许0作为第一个字符,同时也允许值为"",这对于创建“虚假”数字输入框非常有用。

^(?!0)[0-9]*$

0

这是你想要的:

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

它也接受像这些数字一样的小数:

423423.423423

0.4234

0

-1
有时正则表达式在某些浏览器中甚至无法工作。因此,这里提供了类似的逻辑:
function name(e)
{

var key = window.event ? e.keyCode : e.which;
var keychar = String.fromCharCode(key);
var reg = /\d/;

var textField=document.getElementById("ID").value;

if(key==48)
{
if(textField==""||textField==null)
{
e.preventDefault();
return false;
}

else{
return true;
}
}

else
{
var reg = /\d/;
return reg.test(keychar);
}
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接