我有以下内容来检查电话号码是否采用以下格式(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)
它并不总是匹配,但它将匹配包含三个数字的任何字符串,后跟一个连字符,后跟四个以上的数字.它也会匹配,如果有一些看起来像前面的区号.所以根据你的正则表达式这是有效的:
%%%%%%%%%%%%%%(999)123-4567%%%%%%%%%%%%%%%%%
Run Code Online (Sandbox Code Playgroud)
要验证字符串是否包含电话号码而不是其他内容,您需要在正则表达式的开头和结尾添加锚点:
@"^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$"
Run Code Online (Sandbox Code Playgroud)
Alan Moore很好地解释了你的exp实际在做什么.+1
如果你想完全匹配"(XXX)XXX-XXXX"而绝对没有别的,那么你想要的是什么
@"^\(\d{3}\) \d{3}-\d{4}$"
Run Code Online (Sandbox Code Playgroud)
这是我使用的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)