我想验证一个电话号码。 我的条件是我想要给定字符串中的最小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
答案 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;