2010-01-21 116 views
79

我需要确定电话号码是否有效,然后再尝试拨打它。电话可以去世界任何地方。什么正则表达式将匹配有效的国际电话号码?

什么正则表达式将匹配有效的国际电话号码?

+0

如何样了服务号码的正则表达式的任何错误处理?只要尝试拨打电话并处理无效号码,就像其他错误一样。 – 2010-01-21 23:58:20

+3

虽然正确的是正则表达式无法确定这一点,但每个出站尝试都会消耗时间和资源。对号码进行快速的完整性检查可以确保明显的虚假呼叫不会阻止有价值的渠道。 – 2010-01-22 00:01:30

+1

LOL @ paxdiablo ....我想1-800-CALL-HELP会通过你的RegExp测试...... lol – 2010-01-22 00:31:31

回答

62
\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d| 
2[98654321]\d|9[]|8[6421]|6[]|5[87654321]| 
4[987654310]|3[]|2[70]|7|1)\d{1,14}$ 

是匹配通用国际电话号码的正确格式。我用标准的国际接入码标识符'+'替换了美国的以陆线为中心的国际接入码011,这是强制性的。我还将全国号码的最低限额改为至少一位数字。

请注意,如果您将此格式的数字输入到您的手机地址簿中,则无论您在哪里旅行,都可以成功拨打地址簿中的任意号码。对于陆上线路,请将正号替换为您拨打的国家的国际接入码。

请注意,这并不考虑国家号码规划规则 - 具体地说,它允许国家号码规划可能不允许的零和地点号码,也允许一些国家的号码长度大于国家号码规划(例如,美国)。

+4

似乎对我很明智。我打算用这个 – Sevenearths 2011-09-06 10:14:44

+6

这是无效的。欧洲的电话号码可以在开头没有加号的情况下以0开头。因此,如果写成0044 8984 1234这个正则表达式(以及其他答案也不支持),则电话号码如:+44 8984 1234(英国)也是完全有效的。 – Xeroxoid 2015-08-11 15:29:41

+0

@Eric,那么我会从挪威开始:\ + 47 [84] [0-9] {7} \。走! – 2015-11-18 10:23:32

63

所有国家代码由国际电联定义。以下正则表达式基于ITU-T E.164和Annex to ITU Operational Bulletin No. 930 – 15.IV.2009。它包含所有当前的国家代码和代码,以备将来使用。虽然可以缩短一点,但我决定独立包含每个代码。

这是针对来自美国的来电。对于其他国家,请将国际接入码(正则表达式开头的011)替换为适用于该国家的dialing plan

另外,请注意,ITU E.164将全部国际电话号码的最大长度定义为15位数字。这意味着三位国家代码最多可以产生12个附加数字,而一个1位国家代码最多可以包含14个附加数字。因此,

[0-9]{0,14}$ 

一个正则表达式的结尾。

最重要的是,这个正则表达式并不意味着这个数字是有效的 - 每个国家都定义了自己的内部编号计划。这只能确保国家代码有效。

^011(999 | 998 | 997 | 996 | 995 | 994 | 993 | 992 | 991 | 990 | 979 | 978 | 977 | 976 | 975 | 974 | 973 | 972 | 971 | 970 | 969 | 968 | 967 | 966 | 965 | 964 | 963 | 962 | 961 | 960 | 899 | 898 | 897 | 896 | 895 | 894 | 893 | 892 | 891 | 890 | 889 | 888 | 887 | 886 | 885 | 884 | 883 | 882 | 881 | 880 | 879 | 878 | 877 | 876 | 875 | 874 | 873 | 872 | 871 | 870 | 859 | 858 | 857 | 856 | 855 | 854 | 853 | 852 | 851 | 850 | 839 | 838 | 837 | 836 | 835 | 834 | 833 | 832 | 831 | 830 | 809 | 808 | 807 | 806 | 805 | 804 | 803 | 802 | 801 | 800 | 699 | 698 | 697 | 696 | 695 | 694 | 693 | 692 | 691 | 690 | 689 | 688 | 687 | 686 | 685 | 684 | 683 | 682 | 681 | 680 | 679 | 678 | 677 | 676 | 675 | 674 | 673 | 672 | 671 | 670 | 599 | 598 | 597 | 596 | 595 | 594 | 593 | 592 | 591 | 590 | 509 | 508 | 507 | 506 | 505 | 504 | 503 | 502 | 501 | 500 | 429 | 428 | 427 | 426 | 425 | 424 | 423 | 422 | 421 | 420 | 389 | 388 | 387 | 386 | 385 | 384 | 383 | 382 | 381 | 380 | 379 | 378 | 377 | 376 | 375 | 374 | 373 | 372 | 371 | 370 | 359 | 358 | 357 | 356 | 355 | 354 | 353 | 352 | 351 | 350 | 299 | 298 | 297 | 296 | 295 | 294 | 293 | 292 | 291 | 290 | 289 | 288 | 287 | 286 | 285 | 284 | 283 | 282 | 281 | 280 | 269 | 268 | 267 | 266 | 265 | 264 | 263 | 262 | 261 | 260 | 259 | 258 | 257 | 256 | 255 | 254 | 253 | 252 | 251 | 250 | 249 | 248 | 247 | 246 | 245 | 244 | 243 | 242 | 241 | 240 | 239 | 238 | 237 | 236 | 235 | 234 | 233 | 232 | 231 | 230 | 229 | 228 | 227 | 226 | 225 | 224 | 223 | 222 | 221 | 220 | 219 | 218 | 217 | 216 | 215 | 214 | 213 | 212 | 211 | 210 | 98 | 95 | 94 | 93 | 92 | 91 | 90 | 86 | 84 | 82 | 81 | 66 | 65 | 64 | 63 | 62 | 61 | 60 | 0 | 0 | 0 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |更| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 0 | 0 | | | | | | | | | 41 | 40 | 39 | 36 | 34 | 33 | 32 | 31 | 30 | 27 | 20 | 7 | 1)[0-9] {0, 14} $

+168

疯狂+1。 – 2010-01-21 23:50:33

+5

ahhh !!!正则表达式的大墙! – Earlz 2010-01-21 23:51:12

+10

几乎没有错......“011”不是国际代码的一部分。这正是美国人需要拨打的国际电话。该前缀将根据您拨打的位置而改变...因此,该前缀不是数字的一部分。 – 2010-01-21 23:51:16

0

国际编号计划是基于ITU E.164编号计划。我想这是你的正则表达式的起点。

如果我能够根据ITU E.164编号创建正则表达式,我会更新它。

10

这是你的正则表达式的“优化”的版本:

^011(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d| 
2[98654321]\d|9[]|8[6421]|6[]|5[87654321]| 
4[987654310]|3[]|2[70]|7|1)\d{0,14}$ 

,可随时更换\d s的[0-9]如果您正则表达式的语法不支持\d

26

这是一个进一步的优化。

\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d| 
2[98654321]\d|9[]|8[6421]|6[]|5[87654321]| 
4[987654310]|3[]|2[70]|7|1) 
\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$ 

(ⅰ)容许有效的国际前缀
(ⅱ),随后9或10位,与任何类型或定界符的放置(除了最后两个数字之间)

这将匹配:
+ 1-234-567-8901
+ 61-234-567-89-01
+ 46-234 5678901
1(234)56 89 901
1(234)56-89 901
+46.234.567.8901
+1/234/567/8901

+2

1为分离器许可处理 – Askolein 2014-08-19 09:16:57

+0

隐而不宣” t为塞浦路斯号码工作。例如。 + 357-98765432 – 2016-08-02 06:48:29

+0

我知道这是一个古老的答案,但是有没有任何选项可以让美国数字可选1? – 2016-12-01 18:23:02

6

这将适用于国际号码;

C#:

@"^((\+\d{1,3}(-|)?\(?\d\)?(-|)?\d{1,5})|(\(?\d{2,6}\)?))(-|)?(\d{3,4})(-|)?(\d{4})((x| ext)\d{1,5}){0,1}$" 

JS:

/^((\+\d{1,3}(-|)?\(?\d\)?(-|)?\d{1,5})|(\(?\d{2,6}\)?))(-|)?(\d{3,4})(-|)?(\d{4})((x| ext)\d{1,5}){0,1}$/ 
7

我用这一个:

/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/ 

优点:识别+或011开头,让它是只要有需要,并处理许多扩展约定。 (#,x,ext,扩展名)

14

您可以使用Google的图书馆libphonenumber

PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); 
String decodedNumber = null; 
PhoneNumber number; 
    try { 
     number = phoneNumberUtil.parse(encodedHeader, null); 
     decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164); 
    } catch (NumberParseException e) { 
     e.printStackTrace(); 
    } 
+0

这可能是一个很好的解决方案,但只是为了检查电话号码,使用这个库之前,你必须输入一个庞大的JS量......因为libphonenumber.js需要[封库(https://developers.google.com/closure/library/docs/gettingstarted).. 。这不是一个轻解:/ – 2017-09-19 14:18:31

6

对于的iOS SWIFT我发现这是很有帮助,

let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$" 
+0

失败+91 9999999999 – iProgrammer 2017-06-21 20:25:23

1

一个简单的版本号的欧洲,所有匹配像0034617393211号,而且长的人作为004401484172842.

^0{2}[0-9]{11,} 

希望它有助于:·)

2

Th ere显然有很多方法可以做到这一点,至今为止所给出的所有不同的答案都证明了这一点,但我会在这里抛出0.02美元的价值,并提供下面的正则表达式,这比几乎所有的上面都要简洁,但也比大多数更透彻。它还有一个很好的副作用,即将国家代码保留在$ 1和本地数字$ 2中。 (1 | 2 | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0129] 0-6] | 7 | 8 [1-469] | 9 [0-58] | [2-9] ..)(\ d +)$

0

这个正则表达式适用于印度,加拿大,欧洲,新西兰,澳大利亚,美国的电话号码,以及它们的国家代码:

"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"

-2

试试这个,我不知道是否有任何电话号码超过12长:

^(00|\+){1}\d{12}$ 
+0

这符合具有数字** **正是12位包括国家代码。这是错误的,因为它没有考虑到世界各地的长度变化。而且,最大长度实际上是[15位](https://en.wikipedia.org/wiki/E.164)。 – tmt 2017-01-26 12:27:11

1
public static boolean validateInternationalPhoneNumberFormat(String phone) { 
    StringBuilder sb = new StringBuilder(200); 

    // Country code 
    sb.append("^(\\+{1}[\\d]{1,3})?"); 

    // Area code, with or without parentheses 
    sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?"); 

    // Phone number separator can be "-", "." or " " 

    // Minimum of 5 digits (for fixed line phones in Solomon Islands) 
    sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?"); 

    // 4 more optional digits 
    sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$"); 

    return Pattern.compile(sb.toString()).matcher(phone).find(); 
} 
+0

虽然此代码段可能会回答问题,但它不提供任何上下文来解释如何或为什么。考虑增加一两句话来解释你的答案。 – brandonscript 2016-10-31 18:32:18

0

这对我的作品,虽然没有00,001 0011等前缀:

/^\+*(\d{3})*[0-9,\-]{8,}/ 
0

这里是以下最常见的电话号码的情况正则表达式。虽然这是从美国的地区代码角度量身定做的,但它适用于国际场景。

  1. 实际的数字应该只有10位数。
  2. 对于美国区号,区号可以用圆括号()包围。
  3. 国家代码可以是1到3位数字。也可以在前面加上+号。
  4. 国家代码,地区代码和其余号码之间可能有破折号,空格,点号或空格。
  5. 有效的电话号码不能全为零。

    ^(?!\b(0)\1+\b)(\+?\d{1,3}[. -]?)?\(?\d{3}\)?([. -]?)\d{3}\3\d{4}$ 
    

说明:

^- start of expression 
    (?!\b(0)\1+\b) - (?!)Negative Look ahead. \b - word boundary around a '0' character. \1 backtrack to previous capturing group (zero). Basically don't match all zeros. 
    (\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[. -]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional. 
    \(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code. 
    ([. -]?) - optional space, dash or dot 
    $ - end of expression 

更多示例和解释 - https://regex101.com/r/hTH8Ct/2/

0

我已经使用这个下面:

^(\+|00)[0-9]{1,3}[0-9]{4,14}(?:x.+)?$ 

格式+ CCC.NNNNNNNNNNxEEEE或00CCC .NNNNNNNNNNxEEEE

电话号码必须以'+'或'00'开头才能拨打国际电话。 其中C是1-3位的国家代码,

N是最多14位,

,以及E是(可选的)的扩展。

需要领导加号和国家代码后面的点。只有提供扩展名时才需要字面“x”字符。

1

修改@ Eric的正则表达式 - 添加了所有国家的列表。码(从xxxdepy @ Github得到了他们 我希望你会发现它的帮助:

/(\+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[]|8[6421]|6[]|5[87654321]|4[987654310]|3[]|2[70]|7|1)\d{4,20}$/