我需要一个正则表达式,验证给定字符串中的最小7位数

时间:2009-07-13 07:47:14

标签: c# .net regex validation

我想验证一个电话号码。 我的条件是我想要给定字符串中的最小7个数字,忽略分隔符,X,parantheses。

实际上我想在正则表达式中实现这个功能:

Func<string, bool> Validate = s => s.ToCharArray().Where(char.IsDigit).Count() >= 7;
Func<string, bool> RegexValidate = s => System.Text.RegularExpressions.Regex.IsMatch(s, @"regex pattern should come here.")
string x = "asda 1234567 sdfasdf";
string y = "asda   sdfa 123456 sdfasdf";

bool xx = Validate(x); //true
bool yy = Validate(y); //false

我需要的目的是我想在asp中包含这个正则表达式:RegularExpressionValidator

3 个答案:

答案 0 :(得分:35)

七位或更多位数,与任何其他类型的字符混合?这似乎不是一个非常有用的要求,但是你去了:

^\D*(?:\d\D*){7,}$

答案 1 :(得分:7)

(?:\d.*){7,}
  • (?:...) - 将包含的模式分组为原子单元
  • \d - 匹配数字
  • .*匹配0或更多任何字符
  • {7,}匹配前一个模式中的7个或更多

如果你想忽略的唯一分隔符是空格,破折号,括号和字符“X”,那么请改用它:

(?:\d[- ()X]*){7,}
  • [...]创建一个字符类,匹配任何一个包含的字符

不同之处在于,例如,第一个正则表达式将匹配"a1b2c3d4e5f6g7h",而第二个正则表达式不匹配。

正如Gregor在评论中指出的那样,正则表达式的选择取决于你正在使用它的功能。一些函数期望正则表达式匹配整个字符串,在这种情况下,您应该在前面添加额外的.*以匹配7位数之前的任何填充。有些人只希望正则表达式匹配字符串的一部分(这是我在我的例子中所期望的)。

根据documentation for IsMatch(),它只表示正则表达式是否在输入字符串中找到匹配项,“不要求它匹配整个字符串,因此您不需要修改我的示例工作

答案 2 :(得分:1)

为什么要为此使用正则表达式?您发布的第一个Validate函数只是简单地计算位数,这个函数更容易理解,也可能更快。我只是放弃了不必要的ToCharArray调用,将谓词折叠到Count函数中并完成它:

s.Count(char.IsDigit) >= 7;

请注意,如果您只想接受“普通”数字(即0-9),那么您需要更改验证功能,因为IsDigit匹配许多不同的数字表示,例如

s.Count(c => c >= '0' && c <= '9') >= 7;