我有以下规则:
不允许任何序列的数字开头有4个或更多的0。
所以这个数字:
0000438967将验证失败(4个零)
但是这个号码:
0004389678(3个零)将通过确认。这个问题的原因是我需要验证我是否做得正确,因为当检查在线Regex验证器时,我得到了混合的验证结果。我知道这听起来像是一个简单的问题,但其他人的验证是重要的。谢谢Russ
aamkag611#
在这个问题上的试验和错误答案令人难以置信的数量!解决方案就这么简单:
string number = "0000438967"; bool pass = Regex.IsMatch(number, @"^0{0,3}[1-9]\d*$");
这允许任何长度的数字,只要至少有一个非零数字。将最后一个星号替换为{n}或{m,n},以检查长度。当然,您可能希望构造一个Regex示例以供重复使用。如果你还需要数值,你可以立即解析它,如果pass == true:
pass == true
int value = Int32.Parse(number);
当然,根据您希望允许的最大长度,您可能需要一个Int64...但无论如何,你必须在正则表达式中提供一个最大长度,否则Parse可能会导致溢出。
Int64
Parse
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
mrwjdhj33#
零到三个零,后面可选地跟一个非零数字,后面跟任意数量的数字:
0{0,3}([1-9][0-9]*)?
它应接受:000同时拒绝任何开头有4+ 0的数字。不要使用lookahead/behind,因为这会触发回溯。编辑:如果你的匹配函数没有执行精确匹配,那么你需要做:
^0{0,3}([1-9][0-9]*)?$
rjjhvcjd4#
请试试这个。
string myString = "00011111";//Valid if (Regex.IsMatch(myString, @"^[0-9]{3}[1-9]+$")) { Console.WriteLine("Valid"); Console.ReadKey(); }
ep6jt1vc5#
假设你完全不接受零,并且至少接受一个非零的数字,下面是你的正则表达式:
string str = "001"; bool passed = Regex.IsMatch(str, @"^0{0,3}[1-9]\d*$");
说明:正则表达式检查0到3个“0”,然后检查一个非“0”数字,然后检查零个或多个任何数字。
如果“000”是可接受,则来自@hwnd的负前瞻解决方案更优雅。我会使用0{4}而不是0000。
0{4}
0000
gstyhher6#
你可以使用正则表达式来判断字符串是否有效
!Regex.Match(str, @"^0000(\d+)", RegexOptions.IgnoreCase).Success
下面是工作样本rextester
6条答案
按热度按时间aamkag611#
在这个问题上的试验和错误答案令人难以置信的数量!解决方案就这么简单:
这允许任何长度的数字,只要至少有一个非零数字。将最后一个星号替换为{n}或{m,n},以检查长度。
当然,您可能希望构造一个Regex示例以供重复使用。
如果你还需要数值,你可以立即解析它,如果
pass == true
:当然,根据您希望允许的最大长度,您可能需要一个
Int64
...但无论如何,你必须在正则表达式中提供一个最大长度,否则Parse
可能会导致溢出。iq3niunx2#
如果必须使用正则表达式,可以使用Negative LookaheadAssert。
查找是零宽度Assert。它们不消耗字符串上的任何字符。零宽度的点是验证正则表达式是否可以从当前位置向前或向后匹配,而不将它们添加到整体匹配中。
示例:
mrwjdhj33#
零到三个零,后面可选地跟一个非零数字,后面跟任意数量的数字:
它应接受:
000
同时拒绝任何开头有4+ 0的数字。
不要使用lookahead/behind,因为这会触发回溯。
编辑:如果你的匹配函数没有执行精确匹配,那么你需要做:
rjjhvcjd4#
请试试这个。
ep6jt1vc5#
假设你完全不接受零,并且至少接受一个非零的数字,下面是你的正则表达式:
说明:正则表达式检查0到3个“0”,然后检查一个非“0”数字,然后检查零个或多个任何数字。
如果“000”是可接受,则来自@hwnd的负前瞻解决方案更优雅。我会使用
0{4}
而不是0000
。gstyhher6#
你可以使用正则表达式来判断字符串是否有效
下面是工作样本rextester