我正在尝试使用电话号码进行正则表达式。我正在使用命名捕获,所以希望我的正则表达式会更容易理解。
^(?<country_code>1|808)?(?<area_code>\d{3})?(?<local_number>\d{7})$
假设如下:
试验:
12025551212
&lt; - 1 202 5551212 2025551212
&lt; - 202 5551212 8082025551212
&lt; - 808 202 5551212 8085551212
&lt; - 问题最后一次测试的问题是正则表达式认为808
是国家/地区代码。虽然在此字符串中,808
表示区号。我应该如何修改我的正则表达式,以便将808解释为区号而不是国家代码?
答案 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位数字。
答案 4 :(得分:0)
问题是,如果您的号码有国家代码,它也必须运行区号。因此,它必须是长度为13,在你的正则表达式中没有被反映。
将其更改为以下内容:
^((?<country_code>1|808)(?<area_code>\d{3})|(?<area_code>\d{3})?)(?<local_number>\d{7})$
第一个备选方案的长度为4或6,第二个为0或3.因为您匹配完整的输入,最多一个备选方案可以匹配任何输入。