代码之家  ›  专栏  ›  技术社区  ›  Abtin Forouzandeh

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

  •  88
  • Abtin Forouzandeh  · 技术社区  · 14 年前

    我需要先确定一个电话号码是否有效,然后再尝试拨号。电话可以打到世界任何地方。

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

    21 回复  |  直到 6 年前
        1
  •  75
  •   Eric    13 年前
    \+(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}$
    

    是匹配通用国际电话号码的正确格式。我用标准国际接入码标识符“+”替换了以美国陆地线路为中心的国际接入码011,使之成为强制性的。我还把国家号码的最小值改为至少一个数字。

    请注意,如果您在移动电话通讯簿中输入此格式的号码,则无论您在哪里旅行,都可以成功拨打通讯簿中的任何号码。对于陆上线路,请将加号替换为您所拨国家的国际接入码。

    请注意,这并没有考虑到国家编号计划规则——特别是,它允许在国家编号计划可能不允许的位置使用零和一,还允许一些国家(如美国)的编号长度大于国家编号计划。

        2
  •  66
  •   Abtin Forouzandeh    14 年前

    所有国家代码都由ITU定义。以下regex基于ITU-T E.164和 Annex to ITU Operational Bulletin No. 930 – 15.IV.2009 . 它包含所有当前国家/地区代码和保留供将来使用的代码。虽然它可以缩短一点,但我决定独立地包含每个代码。

    这是针对来自美国的呼叫。对于其他国家,请将国际接入码(regex开头的011)替换为适合该国家的 dialing plan .

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

    [0-9]{0,14}$
    

    a正则表达式的结尾。

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

    ^ 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| 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$

        3
  •  29
  •   fezfox    11 年前

    这是一个进一步的优化。

    \+(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位数字,包括任何类型或放置的熟食店(后两位数字之间的除外)

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

        4
  •  18
  •   Paulo Fidalgo    11 年前

    你可以用图书馆 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();
        }
    
        5
  •  10
  •   Laurence Gonsalves    14 年前

    以下是您的regex的“优化”版本:

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

    您可以替换 \d 带着 [0-9] 如果您的regex语法不支持 D .

        6
  •  7
  •   TOBlender    11 年前

    我用这个:

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

    优点:识别+或011开始,让它在需要时长,并处理许多扩展约定。(,X,分机,分机)

        7
  •  6
  •   JRG-Developer    11 年前

    这将适用于国际数字;

    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}$/
    
        8
  •  6
  •   Zaid Pathan    10 年前

    为了 iSwift公司 我觉得这很有用,

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

    修改了@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[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{4,20}$/
    
        10
  •  2
  •   trekinaz    9 年前

    显然,有很多方法可以做到这一点,从目前给出的所有不同答案可以证明这一点,但我会将我的0.02美元投入到这里,并提供下面的regex,这比上面几乎所有的都要简洁,但也比大多数方法更彻底。它还有一个很好的副作用,就是将国家代码保留为$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+)$

        11
  •  1
  •   Roc Boronat    9 年前

    一个简单的欧洲数字版本,匹配的数字如0034617393211,但也长的数字为004401484172842。

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

    希望有帮助:_·)

        12
  •  1
  •   Cássio    8 年前
    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();
    }
    
        13
  •  1
  •   Appy    7 年前

    下面是以下最常见的电话号码方案的regex。虽然这是从美国的角度为区号量身定制的,但它适用于国际场景。

    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/

        14
  •  0
  •   Buhake Sindi Tesnep    14 年前

    国际编号计划以国际电联为基础。 E.164 编号计划。我想这就是正则表达式的起点。

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

        15
  •  0
  •   brodoll    8 年前

    此regex表达式适用于印度、加拿大、欧洲、新西兰、澳大利亚、美国的电话号码及其国家代码:

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

        16
  •  0
  •   redwud    7 年前

    这对我有效,没有00、001、0011等前缀,但是:

    /^\+*(\d{3})*[0-9,\-]{8,}/
    
        17
  •  0
  •   Tony Vlcek    7 年前

    尽管这并不是真正使用regexp来完成任务,或者可能是因为这个原因,但对我来说,这看起来是一个很好的解决方案: https://intl-tel-input.com/node_modules/intl-tel-input/examples/gen/is-valid-number.html

        18
  •  0
  •   Gagan Ahuja    6 年前

    尝试以下API进行电话号码验证。 这也将返回国家、地区和提供商

    演示 https://libphonenumber.appspot.com/

    吉特 https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0

        19
  •  0
  •   AbdulAhmad Matin harish    6 年前

    试试这个,它对我有用。

    ^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
    
        20
  •  -1
  •   Rousonur Jaman    7 年前

    我在下面使用过:

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

    格式+ccc.nnnnnnxeee或00ccc.nnnnnnxeee

    国际长途电话的电话号码必须以“+”或“00”开头。 其中c是1_“3位国家代码,

    n最多14位,

    e是(可选)扩展名。

    必须有前导加号和国家代码后的点。只有在提供扩展名的情况下,才需要文本__x__字符。

        21
  •  -4
  •   Undo ptrk    8 年前

    试试这个,我不知道有没有超过12的电话号码:

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