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

时间:2010-01-21 23:48:02

标签: regex telephony ivr

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

哪个正则表达式会匹配有效的国际电话号码?

24 个答案:

答案 0 :(得分:76)

\+(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,使其成为强制性的。我还将国家号码的最小值更改为至少一位数。

请注意,如果您以此格式在手机地址簿中输入数字,无论您在何处旅行,都可以成功拨打地址簿中的任何号码。对于陆线,请将plus替换为您拨打国家/地区的国际访问代码。

请注意,这并未考虑国家号码计划规则 - 具体而言,它允许在国家号码计划可能不允许的位置使用零和一个,并且还允许某些国家/地区的号码长度大于国家号码计划(例如, US)。

答案 1 :(得分:65)

所有国家代码均由国际电联确定。以下正则表达式基于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 |   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} $

答案 2 :(得分:29)

这是进一步的优化。

\+(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-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

答案 3 :(得分:20)

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

答案 4 :(得分:9)

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

^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]替换为\d

答案 5 :(得分:9)

我用这个:

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

优点:识别+或011开头,让它尽可能长,并处理许多扩展约定。 (#中,x,电话分机,扩展)

答案 6 :(得分:7)

这适用于国际号码;

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 :(得分:6)

对于 iOS SWIFT ,我觉得这很有用,

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

答案 8 :(得分:4)

修改@ 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}$/

答案 9 :(得分:4)

对于那些很棒的答案,请不要提出批评,我只想介绍我用于管理员内容创建者的简单解决方案:

^(\+|00)[1-9][0-9 \-\(\)\.]{7,}$

强制以加号或两个零开头,并至少使用一点数字,空格,花括号,减号和点是可选的,没有其他字符。您可以安全地删除所有非数字,并在tel:输入中使用它。数字将具有一种常见的表示形式,我不必担心会受到限制。

答案 10 :(得分:2)

显然有多种方法可以做到这一点,到目前为止给出的所有不同答案都证明了这一点,但是我会在这里抛出0.02美元的价值并提供下面的正则表达式,这是一个比上面所有的更简洁,但比大多数更彻底。它还有一个很好的副作用,即将国家代码保留为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)

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

答案 12 :(得分:1)

欧洲数字的简单版本,与0034617393211等数字相匹配,但也与004401484172842相匹配。

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

希望它有所帮助:·)

答案 13 :(得分:1)

以下是针对以下最常见电话号码方案的正则表达式。虽然这是根据美国的区域代码量身定制的,但它适用于国际场景。

  1. 实际数字应仅为10位数。
  2. 对于美国号码,区号可以用括号()括起来。
  3. 国家/地区代码长度可以是1到3位数。可选地可以在前面加上+号。
  4. 国家/地区代码,区号和其他号码之间可能有短划线,空格,圆点或空格。
  5. 有效的电话号码不能全为零。

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

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

它适用于 00xx+xx

^(?:00|\+)(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}$

答案 15 :(得分:0)

我为欧洲电话号码制作了正则表达式,它是针对拨号前缀与号码长度的关系。

const PhoneEuropeRegExp = () => {
    // eu phones map https://en.wikipedia.org/wiki/Telephone_numbers_in_Europe
    const phonesMap = {
        "43": [4, 13],
        "32": [8, 10],
        "359": [7, 9],
        "385": [8, 9],
        "357": 8,
        "420": 9,
        "45": 8,
        "372": 7,
        "358": [5, 12],
        "33": 9,
        "350": 8,
        "49": [3, 12],
        "30": 10,
        "36": [8, 9],
        "354": [7, 9],
        "353": [7, 9],
        "39": [6, 12],
        "371": 8,
        "423": [7, 12],
        "370": 8,
        "352": 8,
        "356": 8,
        "31": 9,
        "47": [4, 12],
        "48": 9,
        "351": 9,
        "40": 9,
        "421": 9,
        "386": 8,
        "34": 9,
        "46": [6, 9],
    };
    const regExpBuilt = Object.keys(phonesMap)
        .reduce(function(prev, key) {
            const val = phonesMap[key];
            if (Array.isArray(val)) {
                prev.push("(\\+" + key + `[0-9]\{${val[0]},${val[1]}\})`);
            } else {
                prev.push("(\\+" + key + `[0-9]\{${val}\})`);
            }
            return prev;
        }, [])
        .join("|");
    return new RegExp(`^(${regExpBuilt})$`);
};

alert(PhoneEuropeRegExp().test("+420123456789"))

答案 16 :(得分:0)

尝试一下,它对我有用。

^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$

答案 17 :(得分:0)

尝试使用以下API进行电话号码验证。 此外,这将返回国家,地区和提供商

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

GIT中 https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0

答案 18 :(得分:0)

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

如果我根据ITU E.164编号创建正则表达式,我会更新此内容。

答案 19 :(得分:0)

即使这不是真的使用RegExp来完成工作 - 或者也许是因为这样 - 这对我来说似乎是一个很好的解决方案:https://intl-tel-input.com/node_modules/intl-tel-input/examples/gen/is-valid-number.html

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

此Regex Expression适用于印度,加拿大,欧洲,新西兰,澳大利亚,美国的电话号码及其国家/地区代码:

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

答案 22 :(得分:-1)

我在下面使用过这个:

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

格式+ CCC.NNNNNNNNNNxEEEE或00CCC.NNNNNNNNNNxEEEE

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

N最多14位,

和E是(可选)扩展名。

国家/地区代码后面的前导加号和点数是必需的。只有在提供扩展名时才需要文字“x”字符。

答案 23 :(得分:-4)

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

vsprintf