C#正则表达式电话号码检查

我有以下内容来检查电话号码是否采用以下格式(XXX)XXX-XXXX。 以下代码始终返回true。 不知道为什么。

Match match = Regex.Match(input, @"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}"); // Below code always return true if (match.Success) { ....} 

它并不总是匹配,但它将匹配包含三个数字的任何字符串,后跟连字符,后跟四个数字。 它也会匹配,如果有一些东西看起来像前面的区号。 所以根据你的正则表达式这是有效的:

 %%%%%%%%%%%%%%(999)123-4567%%%%%%%%%%%%%%%%% 

要validation字符串是否包含电话号码,您需要在正则表达式的开头和结尾添加锚点 :

 @"^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$" 

关于电话号码的正则表达式模式的一般抱怨是,他们需要一个人将真正的可选字符作为破折号和其他项目。

为什么它们不是可选的,并且如果它们存在或不存在则不关心模式?

以下模式使用户可以选择破折号,句点和括号,并使用命名捕获作为结果关注数字。

模式被注释(使用#并跨越多行),因此除非删除注释,否则请使用Regex选项IgnorePatternWhitespace 。 因为该标志不影响正则表达式处理,它只允许通过#字符和换行符对模式进行注释。

 string pattern = @" ^ # From Beginning of line (?:\(?) # Match but don't capture optional ( (?\d{3}) # 3 digit area code (?:[\).\s]?) # Optional ) or . or space (?\d{3}) # Prefix (?:[-\.\s]?) # optional - or . or space (?\d{4}) # Suffix (?!\d) # Fail if eleventh number found"; 

上面的模式只查找10个数字并忽略任何填充字符,例如a (或破折号-或空格或制表符甚至a。。例如

 (555)555-5555 (OK) 5555555555 (ok) 555 555 5555(ok) 555.555.5555 (ok) 55555555556 (not ok - match failure - too many digits) 123.456.789 (failure) 

相同模式的不同变体

没有注释的模式不再需要使用IgnorePatternWhiteSpace

 ^(?:\(?)(?\d{3})(?:[\).\s]?)(?\d{3})(?:[-\.\s]?)(?\d{4})(?!\d) 

不使用命名捕获时的模式

 ^(?:\(?)(\d{3})(?:[\).\s]?)(\d{3})(?:[-\.\s]?)(\d{4})(?!\d) 

如果使用ExplicitCapture选项,则为Pattern

 ^\(?(?\d{3})[\).\s]?(?\d{3})[-\.\s](?\d{4})(?!\d) 

Alan Moore很好地解释了你的exp实际在做什么。 +1

如果你想完全匹配“(XXX)XXX-XXXX”而绝对没有别的,那么你想要的是什么

 @"^\(\d{3}\) \d{3}-\d{4}$" 

这是我使用的C#代码。 它旨在从一页文本中获取所有电话号码。 它适用于以下模式:0123456789,012-345-6789,(012)-345-6789,(012)3456789 012 3456789,012 345 6789,012 345-6789,(012)345-6789,012.345.6789

 List phoneList = new List(); Regex rg = new Regex(@"\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})"); MatchCollection m = rg.Matches(html); foreach (Match g in m) { if (g.Groups[0].Value.Length > 0) phoneList.Add(g.Groups[0].Value); } 

上述评论中没有一个能够处理国际号码,例如+33 6 87 17 00 11(例如法国的有效电话号码)。 我会采用两步法:1。删除所有不是数字或’+’字符的字符2.检查+符号是否在开头或不在那里。 检查长度(这可能非常困难,因为它取决于当地的国家/地区编号方案)。 现在,如果您的号码以+1开头,或者您确定该用户位于美国,那么您可以应用上述评论。