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

Nat*_*Pet 6 .net c# regex

我有以下内容来检查电话号码是否采用以下格式(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) { ....}
Run Code Online (Sandbox Code Playgroud)

Ωme*_*Man 13

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

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

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

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

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

上面的模式只查找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)
Run Code Online (Sandbox Code Playgroud)

相同模式的不同变体

没有评论的模式不再需要使用IgnorePatternWhiteSpace:

^(?:\(?)(?<AreaCode>\d{3})(?:[\).\s]?)(?<Prefix>\d{3})(?:[-\.\s]?)(?<Suffix>\d{4})(?!\d)
Run Code Online (Sandbox Code Playgroud)

不使用命名捕获时的模式

^(?:\(?)(\d{3})(?:[\).\s]?)(\d{3})(?:[-\.\s]?)(\d{4})(?!\d)
Run Code Online (Sandbox Code Playgroud)

如果使用ExplicitCapture选项,则为模式

^\(?(?<AreaCode>\d{3})[\).\s]?(?<Prefix>\d{3})[-\.\s](?<Suffix>\d{4})(?!\d)
Run Code Online (Sandbox Code Playgroud)


Ala*_*ore 9

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

%%%%%%%%%%%%%%(999)123-4567%%%%%%%%%%%%%%%%%
Run Code Online (Sandbox Code Playgroud)

要验证字符串是否包含电话号码而不是其他内容,您需要在正则表达式的开头和结尾添加锚点:

@"^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$"
Run Code Online (Sandbox Code Playgroud)


min*_*now 6

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

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

@"^\(\d{3}\) \d{3}-\d{4}$"
Run Code Online (Sandbox Code Playgroud)


gad*_*ssh 5

这是我使用的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<string> phoneList = new List<string>();
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);
}
Run Code Online (Sandbox Code Playgroud)