0

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

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

假设如下:

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

测试:

  • 12025551212<-- 1 202 5551212
  • 2025551212<-- 202 5551212
  • 8082025551212<-- 808 202 5551212
  • 8085551212<-- 这里有问题

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

4

5 回答 5

2

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

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

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

话虽如此,您所采取的方法不会在更普遍的基础上起作用。并非所有国家都使用三位数的区号和七位数的本地号码——事实上,并非所有国家都使用区号。(例如,格陵兰的电话号码是六位数,没有区号,因为该国只有大约 56,000 名居民。)

于 2013-04-18T22:43:33.327 回答
1

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

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

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

但是,@Duskwuff 的答案更好,因为它需要存在区号才能匹配国家/地区代码,我认为这更正确。

于 2013-04-18T22:49:47.517 回答
0
^(?:(?<country_code>1|808)?(?<area_code>\d{3}))?(?<local_number>\d{7})$
于 2013-04-18T22:42:48.030 回答
0

使用这样的前瞻:

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

这将确保国家代码后始终有 10 位数字。

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

于 2013-04-18T22:42:55.010 回答
0

问题是,如果您的号码有国家代码,它也必须带有区号。因此,它的长度必须为 13,这不会反映在您的正则表达式中。

将其更改为以下内容:

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

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

于 2013-04-18T22:45:29.147 回答