正则表达式仅验证美国和印度的零售数量

时间:2016-02-19 12:30:53

标签: regex

我正在尝试使用符合以下要求的正则表达式:

  1. 验证美国,印度的零售电话号码

  2. 不包括两个国家/地区的特殊用途/商业用途电话号码。即从800,888,877和866,900开始,美国至少有10位数字,可以有更多指南,但上面只是例如。

  3. 如果包括()+10,它应该验证特殊字符,但是满足所有这些要点应该是一个有效的电话号码。

  4. 如果在STD之前,ISD认为它是有效的。

  5. 固定电话,移动电话都应该有效。

  6. 我看是否有人遇到了相同的要求,但我得到的解决方案有不同的要求而不是我正在寻找的那个。

1 个答案:

答案 0 :(得分:0)

如果没有您想要匹配的电话号码的明确排除/包含列表,这里有一个“模板”正则表达式,可用于匹配美国号码:

(?:^|\b)(\+?1[ -.\/]?)?\(?(?!37|950|958|959|96|976)[2-9]([0-8])(?!\2)\d(?:\) ?|[ -.\/])?[2-9](?!11)\d\d[ -.]?\d{4}(?:$|\b)

分解:

  • (?:^|\b):字符串或中断的开始。例如,这可以防止数字匹配在较长的一系列数字中间开始;
  • (\+?1[ -.\/]?)?:这匹配美国国家/地区代码的可选前缀(即1),并接受+11/+1,{{1}等值};
  • 1:区域代码的可选左括号;
  • \(?:区域代码的排除列表。如果只给出2位数字,则拒绝任何以这些开头的区域代码 - 您需要扩展此列表以识别您要排除的其他“特殊商家”电话号码;
  • (?!37|950|958|959|96|976):区域代码的第一位数字;不能是0或1;
  • [2-9]:区域代码的第二位数字;不能是9;
  • ([0-8]):区域代码的第三位数字;不能与第二个数字相同((?!\2)\d指的是第二个匹配组);
  • \2:可选分隔符:(?:\) ?|[ -.\/])?)-.或空格。如果/,则可以选择后跟空格;
  • ):交换代码的第一位数字;不能是0或1;
  • [2-9]:排除交换代码的第二和第三位数字 - 它们不能同时为1;
  • (?!11):交换代码的第二和第三位;没有进一步的限制;
  • \d\d:可选分隔符;可以是[ -.]?-或空格;
  • .:四位数的客户编号;没有限制。
  • \d{4}:字符串或中断结束。例如,这可以防止数字匹配在较长的一系列数字中间停止;

这是online regex test

我认为以上述为灵感,您可以根据自己的期望对其进行微调,并以相同的方式添加印度格式​​。您可以使用(?:$|\b)运算符来分隔您将拥有的两个子正则表达式,例如|,您需要用实际表达式替换这两个参数。

要同时捕获前缀(US|IND)STD,您可以在中断后的正则表达式中插入以下内容:

ISD

...匹配这些可选单词后跟可选空格。

但是,最终正则表达式的复杂性会增加您想要匹配的精确度并排除无效数字。例如,如果您想要针对All India STD Code List进行验证,那么您的正则表达式会变得非常长且难以管理。