C# 带电话号码的10位移动电话号码的正则表达式

C# 带电话号码的10位移动电话号码的正则表达式,c#,regex,C#,Regex,我想用电话号码为10位数的手机号码做一个正则表达式。例如 9088534816 +91 33 40653155 033-2647-0969 我想做一个正则表达式,可以匹配所有三种格式,如 xxxxxxxxxx +xx xx xxxxxxxx xxx-xxxx-xxxx 格式。有人能帮我吗?我试过这个 \+?\d[\d -]{8,12}\d 但它也需要这个号码12115351689385。这就是我的问题首先简化输入字符串(简化正则表达式模式) 现在只要找到数字 var m = Re

我想用电话号码为10位数的手机号码做一个正则表达式。例如

 9088534816
+91 33 40653155
 033-2647-0969
我想做一个正则表达式,可以匹配所有三种格式,如

 xxxxxxxxxx
+xx xx xxxxxxxx
 xxx-xxxx-xxxx 
格式。有人能帮我吗?我试过这个

\+?\d[\d -]{8,12}\d

但它也需要这个号码12115351689385。这就是我的问题

首先简化输入字符串(简化正则表达式模式)

现在只要找到数字

var m = Regex.Matches(a, @"\+?[0-9]{10}");

分别设计和测试每个图案:

然后将它们组合成最后一个:

 (pattern1)|(pattern2)|...|(patternN)
对于上述三种模式,组合模式为

 (^[0-9]{10}$)|(^\+[0-9]{2}\s+[0-9]{2}[0-9]{8}$)|(^[0-9]{3}-[0-9]{4}-[0-9]{4}$)
您可以实现如下内容:

 //TODO: you may want to load the patterns supported from resource, file, settings etc.
 private static string[] m_Patterns = new string[] {
   @"^[0-9]{10}$",
   @"^\+[0-9]{2}\s+[0-9]{2}[0-9]{8}$",
   @"^[0-9]{3}-[0-9]{4}-[0-9]{4}$",
 };

 private static string MakeCombinedPattern() {
   return string.Join("|", m_Patterns
     .Select(item => "(" + item + ")"));
 }
测试:

string[] tests = new string[] {
  "9088534816",
  "+91 33 40653155",
  "033-2647-0969",
  "123",
  "12115351689385",
};

var result = string
  .Join(Environment.NewLine, tests
  .Select(test => 
     $"{test,18} {(Regex.IsMatch(test, MakeCombinedPattern()) ? "yes" : "no"),3}"));

Console.Write(result);
结果:

        9088534816 yes
   +91 33 40653155 yes
     033-2647-0969 yes
               123  no
    12115351689385  no

第一种和第三种格式(以及大多数更常见的美国电话号码格式)可以组合成一个正则表达式模式:

^[(]?\d{3}[)]?[- ]?\d{3}[- ]?\d{4}$
第二种格式比较复杂,因为它是一个国际电话号码。不同的国家有不同的数字格式,所以解析起来就不那么简单了。如果您希望像您的示例中那样为特定国家添加支持,您也可以为其编写一个模式。你的具体例子是:

^\+\d{2} \d{2} \d{8}$
(我无法像第一种模式那样针对多个约定对其进行优化,因为我不熟悉该电话号码格式。我不知道它是否允许破折号或空格或可选字符或任何其他文化差异。)


在您拥有所有想要的模式之后,您可以像Dmitry的答案建议的那样将它们与
String.Join
组合,然后将结果用作
Regex.Match/Regex.Matches
呼叫的模式。

对于伊朗手机号码,语法是
^[0][9]\d{9}$

有效电话号码的正则表达式

public static bool IsPhoneNumberValid(此字符串电话)
{
bool isValid=false;
如果(!string.IsNullOrWhiteSpace(电话))
{
isValid=Regex.IsMatch(电话,@“\(?\d{3}\)?-?*\d{3}-?*-?\d{4}”,
RegexOptions.IgnoreCase);
}
返回有效;
}

[8,12}\d-{8.12}\d-{8.12}\d-{8.12}\d-{8.12}\d设计和测试每一个模式分别设计和测试:
{8.8.12}\8.12}\d-{8.代码>任何第一次尝试你自己的任何第一次尝试?你自己的任何第一次尝试?是我的是我的肯定是我的是我的???\d?\d-\d-\d-\d-\d-[8.8.8}{8}{0-12}\0-9}{0-9}{0-9}{0-9{10}{0-10}{10}{10}你自己的任何第一次尝试你自己的任何第一次尝试?任何第一次尝试?任何第一次尝试?任何第一次尝试?任何第一次尝试?你自己的尝试?任何第一次使用帖子下方的按钮,包括进一步的信息。我的表达式也接受12115351689385这个数字,这是一个问题。它不是接受简单的10位移动电话号码,比如9088534816,它需要+91 9632226066,工作正常,但是9088534816没有接受。它可以使字符串中有一个空格吗?否则应该有效。@santanu Bhatachraya:我已经编辑了我的答案(
^
$
应该在每个
(…)
中);我还扩展了测试用例(您可以轻松添加自己的测试用例)。据我所知,从结果来看,测试已经通过,如果再多一种格式呢?例如XXXXXXXXXX?如果必须手动添加每种格式,那么使用正则表达式有什么意义?或者输入错误,数字将为“xx--xx xxxx xx”,然后是什么?:)数字是正确的,10位数,只是有点小错误@santanuBhatachraya也许你们应该在输入字段上创建掩码?
^[(]?\d{3}[)]?[- ]?\d{3}[- ]?\d{4}$
^\+\d{2} \d{2} \d{8}$