2010-05-25 26 views
1

我目前有以下的正则表达式接受任何数值,是七位数经常用于验证数值

表达

^\d{7}

如何改善它,所以它会接受的数值七八十个数字?

通行证:,1234567,,123467890
失败:123456,12345678,123456789

+0

您使用什么语言?并非所有的正则表达式都是相等的。 – 2010-05-25 21:23:07

+0

@Mark:我正在使用C#。 – 2010-05-25 21:25:28

回答

5

一个简单的解决办法是这样的:

^\d{7}(\d{3})?$ 

至少有两件事情与此解决方案注意:

  • 在一个unicode上下文中,\d可能比你想要的要多得多(例如digi的外来字符其他非拉丁语言)。
  • 此正则表达式包含一个捕获组。你可能不希望这样。您可以通过将其更改为非捕获组(?: ...)来解决此问题。

所以你可能要改用这稍长表达这些原因:

^[0-9]{7}(?:[0-9]{3})?$ 

下面是C#一个小测试平台,这样就可以看到它的工作原理:

for (int i = 0; i < 12; ++i) 
{ 
    string input = new string('0', i); 
    bool isMatch = Regex.IsMatch(input, "^[0-9]{7}(?:[0-9]{3})?$"); 
    Console.WriteLine(i.ToString().PadLeft(2) + ": " + isMatch); 
} 

结果:

 
0: False 
1: False 
2: False 
3: False 
4: False 
5: False 
6: False 
7: True 
8: False 
9: False 
10: True 
11: False 
+0

这不会接受7到10位数字吗? – 2010-05-25 21:07:12

+0

对不起,我误解了这个问题。现在修好! – 2010-05-25 21:07:54

+0

你是对的;它会接受7到10个字符。 – 2010-05-25 21:09:20

3

编辑:这是错误的,但我会取消删除它,并将其留作参考,因为upvotes表明人们认为它是正确的。正确的解决方法是here


我认为只是:

^\d{7}\d{3}? 
+0

@Mark你的意思是因为它没有尾随'$'?我把它排除在外,因为OP确实,但是,在技术上:) – 2010-05-25 21:09:51

+0

是的,但它与原始正则表达式的“松散”相匹配。:) – 2010-05-25 21:10:02

+0

@Mark它如果你正在做全字符串匹配 – 2010-05-25 21:15:51

2

何不的字面解释你在找什么:

^\d{7}|\d{10}$ 
+1

为了便于阅读 – 2010-05-25 21:25:12

+3

除了这样也不能正常工作,因为这实际上是'^ \ d {7}'或'\ d {10} $'。您需要在其中添加一个非捕获组,例如'^(?:\ d {7} | \ d {10})$'。 – 2010-05-25 21:30:42

+0

+ +1为了让机器做好工作,而不是我 – Bananeweizen 2010-05-25 21:31:37