145

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

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

4

24 回答 24

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

请注意,如果您将这种格式的号码输入到您的手机通讯录中,无论您身在何处,都可以成功拨打通讯录中的任何号码。对于固定电话,将加号替换为您拨打的国家/地区的国际接入代码。

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

于 2011-08-06T15:38:09.673 回答
71

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

这适用于来自美国的呼叫。对于其他国家/地区,将国际访问代码(正则表达式开头的 011)替换为适合该国家/地区拨号计划的任何代码。

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

[0-9]{0,14}$

a 正则表达式的结尾。

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

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

于 2010-01-21T23:49:05.217 回答
37

这是进一步的优化。

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

于 2013-08-03T05:29:40.037 回答
29

您可以使用 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();
    }
于 2013-12-03T11:20:46.707 回答
20

修改了@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}$/
于 2017-12-23T03:34:11.653 回答
15

我用这个:

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

优点:识别 + 或 011 开头,根据需要设置长度,并处理许多扩展约定。(#,x,ext,扩展名)

于 2013-10-25T14:17:45.737 回答
12

没有批评那些伟大的答案我只想展示我为我们的管理员内容创建者使用的简单解决方案:

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

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

于 2020-03-02T13:40:45.213 回答
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}$/
于 2013-10-02T09:06:30.750 回答
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}$

如果您的正则表达式语法不支持,您可以将\ds替换为.[0-9]\d

于 2010-01-22T01:23:46.840 回答
8

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

let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
于 2014-11-25T13:01:33.467 回答
3

这是以下最常见电话号码场景的正则表达式。尽管这是从美国的角度为区号量身定制的,但它适用于国际场景。

  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/

于 2017-06-25T18:28:46.887 回答
3

我在下面使用了这个:

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

格式 +CCC.NNNNNNNNNNxEEEE 或 00CCC.NNNNNNNNNNxEEEE

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

N最多为14位,

E 是(可选的)扩展。

前导加号和国家代码后面的点是必需的。仅当提供扩展名时才需要文字“x”字符。

于 2017-08-18T10:22:45.993 回答
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+)$

于 2015-11-19T23:39:43.620 回答
1

欧洲号码的简单版本,匹配 0034617393211 等数字,但也匹配 004401484172842 等长数字。

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

希望能帮助到你 :·)

于 2015-11-11T01:16:00.403 回答
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();
}
于 2016-10-31T17:23:40.600 回答
1

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

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

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

于 2018-03-05T09:01:07.420 回答
0

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

如果我有时间根据 ITU E.164 编号创建正则表达式,我将对此进行更新。

于 2010-01-22T00:28:45.873 回答
0

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

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

于 2016-06-07T09:42:27.263 回答
0

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

/^\+*(\d{3})*[0-9,\-]{8,}/
于 2017-03-25T05:15:50.827 回答
0

即使这并不是真正使用 RegExp 来完成工作——或者可能正因为如此——这对我来说似乎是一个不错的解决方案:https ://intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html

于 2017-10-14T16:40:45.057 回答
0

试试这个,它对我有用。

^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
于 2018-10-22T06:59:17.873 回答
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"))
于 2020-07-10T15:06:55.290 回答
0

00xx它与and配合得很好+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}$
于 2021-01-19T11:00:39.557 回答
-4

试试这个,不知道有没有长于12的电话号码:

^(00|\+){1}\d{12}$
于 2016-09-25T15:24:27.810 回答