regex 如何使用正则表达式验证前面带有零的数字

l3zydbqr  于 2023-06-30  发布在  其他
关注(0)|答案(6)|浏览(226)

我有以下规则:

不允许任何序列的数字开头有4个或更多的0。

所以这个数字:

0000438967
将验证失败(4个零)

但是这个号码:

0004389678(3个零)
将通过确认。
这个问题的原因是我需要验证我是否做得正确,因为当检查在线Regex验证器时,我得到了混合的验证结果。我知道这听起来像是一个简单的问题,但其他人的验证是重要的。
谢谢Russ

aamkag61

aamkag611#

在这个问题上的试验和错误答案令人难以置信的数量!解决方案就这么简单:

string number = "0000438967";
bool pass = Regex.IsMatch(number, @"^0{0,3}[1-9]\d*$");

这允许任何长度的数字,只要至少有一个非零数字。将最后一个星号替换为{n}或{m,n},以检查长度。
当然,您可能希望构造一个Regex示例以供重复使用。
如果你还需要数值,你可以立即解析它,如果pass == true

int value = Int32.Parse(number);

当然,根据您希望允许的最大长度,您可能需要一个Int64...但无论如何,你必须在正则表达式中提供一个最大长度,否则Parse可能会导致溢出。

iq3niunx

iq3niunx2#

如果必须使用正则表达式,可以使用Negative LookaheadAssert。

^(?!0000)\d+$

查找是零宽度Assert。它们不消耗字符串上的任何字符。零宽度的点是验证正则表达式是否可以从当前位置向前或向后匹配,而不将它们添加到整体匹配中。

示例:

Regex.IsMatch("0438967",      @"^(?!0000)\d+$"); // True
Regex.IsMatch("004389678",    @"^(?!0000)\d+$"); // True
Regex.IsMatch("000438967",    @"^(?!0000)\d+$"); // True
Regex.IsMatch("00004389678",  @"^(?!0000)\d+$"); // False
Regex.IsMatch("00000438967",  @"^(?!0000)\d+$"); // False
Regex.IsMatch("000000438967", @"^(?!0000)\d+$"); // False
mrwjdhj3

mrwjdhj33#

零到三个零,后面可选地跟一个非零数字,后面跟任意数量的数字:

0{0,3}([1-9][0-9]*)?

它应接受:
000
同时拒绝任何开头有4+ 0的数字。
不要使用lookahead/behind,因为这会触发回溯。
编辑:如果你的匹配函数没有执行精确匹配,那么你需要做:

^0{0,3}([1-9][0-9]*)?$
rjjhvcjd

rjjhvcjd4#

请试试这个。

string myString = "00011111";//Valid

        if (Regex.IsMatch(myString,  @"^[0-9]{3}[1-9]+$"))
        {
            Console.WriteLine("Valid");
            Console.ReadKey();
        }
ep6jt1vc

ep6jt1vc5#

假设你完全不接受零,并且至少接受一个非零的数字,下面是你的正则表达式:

string str = "001";
bool passed = Regex.IsMatch(str, @"^0{0,3}[1-9]\d*$");

说明:正则表达式检查0到3个“0”,然后检查一个非“0”数字,然后检查零个或多个任何数字。

如果“000”是可接受,则来自@hwnd的负前瞻解决方案更优雅。我会使用0{4}而不是0000

gstyhher

gstyhher6#

你可以使用正则表达式来判断字符串是否有效

!Regex.Match(str, @"^0000(\d+)", RegexOptions.IgnoreCase).Success

下面是工作样本rextester

相关问题