我有以下规则:
不允许在开头使用4个或更多0的任何序列的数字。
所以这个数字:
0000438967
验证失败(4个零)
但是这个数字:
0004389678(3个零)
将通过验证。
这个问题的原因是我需要验证我是否正确地执行了这一操作,因为在检查在线Regex验证器时,我得到了混合的验证结果。我知道这听起来像一个简单的问题,但其他人的验证很重要。
感谢 拉斯
答案 0 :(得分:3)
如果必须使用正则表达式,则可以使用Negative Lookahead断言。
^(?!0000)\d+$
Lookarounds是零宽度断言。它们不会消耗字符串上的任何字符。零宽度的点是验证正则表达式是可以或者不能匹配向前看或从当前位置回顾,而不是将它们添加到整体匹配中。
示例:强>
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
答案 1 :(得分:3)
零到三个零后跟任意一个非零数字后跟任意数量的数字:
0{0,3}([1-9][0-9]*)?
它应该接受:
000
虽然在开头拒绝任何带有4+个零的数字。
不要使用前瞻/后方来触发回溯。
编辑:如果您的匹配功能没有完全匹配,那么您需要执行以下操作:
^0{0,3}([1-9][0-9]*)?$
答案 2 :(得分:3)
令人难以置信的试用数量&关于这个问题的错误答案!解决方案就像这样简单:
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
会导致溢出。
答案 3 :(得分:2)
请试试这个..
string myString = "00011111";//Valid
if (Regex.IsMatch(myString, @"^[0-9]{3}[1-9]+$"))
{
Console.WriteLine("Valid");
Console.ReadKey();
}
答案 4 :(得分:0)
假设你完全不接受零和至少一个非零数字,这是你的正则表达式:
string str = "001";
bool passed = Regex.IsMatch(str, @"^0{0,3}[1-9]\d*$");
解释:正则表达式检查0到3&0; 0' 0,然后检查一个非' 0'数字,然后是任何数字的零或更多。
如果" 000"是可以接受的,然后来自@hwnd的负面预测解决方案更优雅。我只想使用0{4}
代替0000
。
答案 5 :(得分:-2)
您可以使用Regex查找字符串是否有效
!Regex.Match(str, @"^0000(\d+)", RegexOptions.IgnoreCase).Success
这是工作样本rextester