需要一个正则表达式匹配一个数字长度不固定的字符串,不能全为零。

12

我需要验证表单中的输入。我期望这个输入是1到19位数字,而且可以以0开头。但是,我希望验证它们不全部都是0。我有一个正则表达式可以确保输入是数字且在1到19个数字之间。

^\d[1,19]$

但是我无法想出如何包含一个检查,以确保整个字符串不全为零。我尝试过这样做:

^(![0]{1,19})(\d[1,19])$

但是它在0000000000000000001上失败了,因为它允许可变数量的零。

如何检查整个字符串不全是零?

谢谢。

我正在尝试在ASP.NET RegularExpressionValidator中完成此操作,因此希望使用单个表达式。如果无法完成此操作,我还有其他选择。

4个回答

18

^(?!0+$)\d{1,19}$


我之前尝试过这个,但它并不适用于我所提供的示例。不确定 "?" 的作用是什么。 - Notorious2tall
回溯也是如此。 - chaos
@Notorious2tall:看看这个页面:http://www.regular-expressions.info/lookaround.html。 - codelogic
这并不是你所想的“?”意义的一部分,而是完全独立于其语法的一部分。有一个基于“(?”作为特殊序列开头的PCRE语法集,以“(?:”开始进行无位置提取分组。 - chaos
谢谢,annakata。我非常看重你的反馈,因为你的用户名很棒。 :) - chaos
显示剩余2条评论

2

(?!0+$)是一个前瞻指令。?!是负向前瞻命令,用于搜索到字符串末尾有1或多个0。如果匹配成功,则字符被消耗掉,仅留下\d{1,19}的正常数字搜索。

Boost Perl Regexp对Boost认可的perl regexp进行了很好的讨论。


2

只需要做一个负向先行断言:

(?!^0+$)(^\d{1,19})

这在Perl中运行良好。


你应该将 "^" 因式分解并放到最前面;你的做法也能行,但这种方式更清晰地表达了意图。另外,你需要在结尾添加 "$",这样它就不会匹配数字后面的其他任何内容了。 - Alan Moore

0

你不需要用正则表达式来做这个。

            ulong test;
        string number = "1234567890123456789";
        if (ulong.TryParse(number, out test) && (test < 9999999999999999999ul) && (test > 0))
            Console.WriteLine(test);

1
我相信他知道如何为它制定逻辑作为一般情况。他试图将其打包成一个RE,我们可以假设他有这样做的理由。 - chaos
是的,没错。我可以在服务器端验证它,但想用RegExValidator来完成。部分原因是我不想进行后台回发,另一部分原因是我想学习正则表达式。基本上是出于实践和自私的原因。 :) - Notorious2tall
我不熟悉你们的平台,但如果你们的RegExValidator的设计者真的很聪明,他们可能会使其既可以在服务器端运行,又可以作为客户端脚本呈现,这是非常优化的(你也需要在客户端使用它,但永远不要相信客户端)。 - chaos

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