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

在尝试拨号之前,我需要确定一个电话号码是否有效。 电话可以去世界任何地方。

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

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

是匹配通用国际电话号码的正确格式。 我用标准的国际接入码标识符“+”replace了美国电话线中心的国际接入码011,这是强制性的。 我也把国家号码的最低限额改为至less一位数字。

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

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

所有的国家代码由国际电联定义。 以下正则expression式基于ITU-T E.164和国际电联“操作公报”930 – 15.IV.2009的附录 。 它包含所有当前的国家代码和代码,以备将来使用。 虽然可以缩短一点,但我决定独立包含每个代码。

这是来自美国的电话。 对于其他国家,请将国际接入代码(正则expression式开头的011)replace为适用于该国家的拨号scheme 。

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

 [0-9]{0,14}$ 

正则expression式的结尾。

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

^ 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 | 388 | 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 | 2 26 | 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 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51 | 49 | 48 | 47 | 46 | 45 | 44 | 43 | 41 | 40 | 39 | 36 | 34 | 33 | 32 | 31 | 30 | 27 | 20 | 7 | 1)[0-9] {0,14} $

这是一个进一步的优化。

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

(i)允许有效的国际前缀
(ii)随后9或10位数字,以任何types或分隔符(最后两位数字除外)

这将匹配:
+ 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

您可以使用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(); } 

这里是你的正则expression式的“优化”版本:

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

如果您的regex语法不支持\d您可以用[0-9]replace\d s。

我使用这个:

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

优点:承认+或011开始,让它只要需要,并处理许多扩展约定。 (#中,x,电话分机,扩展)

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

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

这将用于国际号码。

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}$/ 

显然有很多方法可以做到这一点,就像迄今为止给出的所有不同的答案所certificate的那样,但是我会在这里抛出0.02美元的价值,并提供下面的正则expression式,这比几乎所有的上面都要简洁,但是比大多数都更彻底。 它也有很好的副作用,使国家代码在$ 1和本地数字在$ 2。

^ \ +(?= \ d {5,15} $)(1 | 2 [078] | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0-6] | 7 | 8 [1-469] | 9 [0-58] | [2-9] ..)(\ d +)$

一个简单的欧洲数字版本,匹配0034617393211这样的数字,也可以是004401484172842。

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

希望能帮助到你 :·)

 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(); } 

国际编号scheme基于ITU E.164编号scheme。 我想这是你的正则expression式的出发点。

如果我能够创build一个基于ITU E.164编号的正则expression式,我会更新它。

此正则expression式适用于印度,加拿大,欧洲,新西兰,澳大利亚,美国电话号码及其国家代码:

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

这适用于我,没有00,001,0011等前缀,但:

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

这是以下最常见的电话号码scheme的正则expression式。 虽然这是从美国的地区代码angular度来量身定做的,但它适用于国际场景。

  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/

我在下面使用了这个:

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

格式为+ CCC.NNNNNNNNNNxEEEE或00CCC.NNNNNNNNNNxEEEE

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

N最多14位,

E是(可选的)扩展名。

国家代码之后的加号和点号是必需的。 只有在提供了扩展名的情况下才需要文字“x”字符。

尽pipe这并不是真的使用RegExp来完成工作,或者正因如此,这看起来像是一个很好的解决scheme: https : //intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html

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

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