正则表达式的电话号码

时间:2013-04-18 22:33:34

标签: regex preg-match

我正在尝试使用电话号码进行正则表达式。我正在使用命名捕获,所以希望我的正则表达式会更容易理解。

^(?<country_code>1|808)?(?<area_code>\d{3})?(?<local_number>\d{7})$

假设如下:

  • 所有区号均为3位数
  • 所有本地号码均为7位数
  • 只有2个国家/地区代码:1和808

试验:

  • 12025551212&lt; - 1 202 5551212
  • 2025551212&lt; - 202 5551212
  • 8082025551212&lt; - 808 202 5551212
  • 8085551212&lt; - 问题

最后一次测试的问题是正则表达式认为808是国家/地区代码。虽然在此字符串中,808表示区号。我应该如何修改我的正则表达式,以便将808解释为区号而不是国家代码?

5 个答案:

答案 0 :(得分:2)

鉴于这些限制,您可以调整正则表达式以要求国家/地区代码与区号配对。我突出了改变的位:

^(?:(?<country_code>1|808)?(?<area_code>\d{3}))?(?<local_number>\d{7})$
 ^^^                                          ^^

现在国家代码和地区代码周围都有一个非捕获组,如果该组完全存在,则需要区域代码组。

话虽这么说,你所采取的方法不会在更一般的基础上发挥作用。并非所有国家/地区都使用三位数的区号和七位数的本地号码 - 事实上,并非所有国家/地区都使用使用区号。 (例如,格陵兰的电话号码长度为六位数,没有区号,因为该国仅有大约56,000名居民。)

答案 1 :(得分:1)

您问题的最简单直接答案可能是:

^(?<country_code>1|808)??(?<area_code>\d{3})?(?<local_number>\d{7})$

使国家/地区代码匹配0-1次不情愿地

然而,@ Duskwuff的答案更好,因为它需要一个区号才能匹配国家代码,我认为这更正确。

答案 2 :(得分:0)

^(?:(?<country_code>1|808)?(?<area_code>\d{3}))?(?<local_number>\d{7})$

答案 3 :(得分:0)

使用这样的前瞻:

^(?<country_code>1|808(?=\d{10}))?(?<area_code>\d{3})?(?<local_number>\d{7})$

这将确保国家/地区代码后总是有10位数字。

现场演示:http://www.rubular.com/r/SnPE3eyB3E

答案 4 :(得分:0)

问题是,如果您的号码有国家代码,它也必须运行区号。因此,它必须是长度为13,在你的正则表达式中没有被反映。

将其更改为以下内容:

^((?<country_code>1|808)(?<area_code>\d{3})|(?<area_code>\d{3})?)(?<local_number>\d{7})$

第一个备选方案的长度为4或6,第二个为0或3.因为您匹配完整的输入,最多一个备选方案可以匹配任何输入。