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

Abt*_*deh 96 regex ivr telephony

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

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

Eri*_*ric 82

\+(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}$
Run Code Online (Sandbox Code Playgroud)

是否匹配通用国际电话号码的正确格式.我用标准的国际访问代码标识符'+'替换了美国陆线中心国际访问代码011,使其成为强制性的.我还将国家号码的最小值更改为至少一位数.

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

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

  • 这是无效的.欧洲电话号码可以从一开始时没有+的双0开始.因此,如果写入0044 8984 1234这个正则表达式(以及其他答案也不支持),则电话号码如:+44 8984 1234(英国)也完全有效. (14认同)
  • 对我来说似乎是明智的.我打算用这个 (5认同)
  • +1。从用户体验的角度来看,是的,在前面允许“00”可能是有意义的。从开发和维护的角度来看,我想说,强制所有数字以“+”开头,甚至每次得到它时都用“+”替换“00”是完全可以的——特别是考虑到大多数人都知道`+` 格式(大多数国际电话输入字段都需要这种格式)。另外,这是一个单行修复,并且更具可读性。这种方法还可以确保所有电话号码都采用相同的格式,并使您的验证更不容易出错,从而使整个过程更易于维护。 (5认同)
  • 而且,在 EDGE 之前(普通 GSM)SMS 的“旧”时代,使用“00”将无法正确发送消息,而以“+”开头则始终可以在国际范围内使用。我们可以疯狂地让它变得超级复杂,但有时有可能/值得放弃一些限制以使我们的生活更轻松:) (3认同)
  • @milosmns 是的,强制所有数字以 + 开头是完全可以的,有一些用户体验友好的方法可以做到这一点。例如,让他们从下拉列表中选择自己的国家/地区,并显示您在电话号码前加上 +44(如果是英国)。现在很明显你必须输入以+开头的数字 (3认同)
  • 结合@fezfox的改进(?)和长度优化:`^\+((?:9 [679] | 8 [035789] | 6 [789] | 5 [90] | 42 | 3 [578] | 2 [1 -689])| 9 [0-58] | 8 [1246] | 6 [0-6] | 5 [1-8] | 4 [013-9] | 3 [0-469] | 2 [70] | 7 | 1)(?:\ W*\d){0,13}\d $` (2认同)

Abt*_*deh 65

所有国家代码均由国际电联确定.以下正则表达式基于ITU-T E.164和国际电联"操作公报"第930 - 15.IV.2009号附件.它包含保留供将来使用的所有当前国家/地区代码和代码.虽然它可以缩短一点,但我决定独立地包含每个代码.

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

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

[0-9]{0,14}$
Run Code Online (Sandbox Code Playgroud)

一个正则表达式的结束.

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

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

  • 几乎是正确的......"011"不是国际代码的一部分.这正是美国人为了拨打国际电话而需要拨打的电话.该前缀将根据您拨打的位置而改变...因此该前缀不是数字的一部分. (12认同)
  • @gmagana - 我在答案中提到(第2段) (3认同)
  • 我的观点是,它不是电话号码的一部分。这就像说“1”美国国内长途拨号前缀是电话号码的一部分。 (2认同)
  • @gmagana - 虽然你是对的,它不是电话号码的一部分,但从技术上讲,它是拨打电话所必需的。 (2认同)
  • @Roger Pate:我花了一些时间搞清楚这一点,我希望它对其他人有用.我也希望其他人可能有更好的解决方案(这就是为什么我没有将自己的答案标记为已接受). (2认同)
  • 对疯狂的评论比答案的票数还多。疯狂! (2认同)

fez*_*fox 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})$
Run Code Online (Sandbox Code Playgroud)

(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 /八千九百○一分之五百六十七


Pau*_*lgo 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();
    }
Run Code Online (Sandbox Code Playgroud)

  • 这可能是一个很好的解决方案,但只是为了检查电话号码,在使用这个库之前,你必须导入大量的 js...因为 libphonenumber.js 需要 [closure library](https://developers.google.com/关闭/图书馆/文档/入门)...这不是一个轻松的解决方案:/ (2认同)

TOB*_*der 11

我用这个:

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

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


小智 10

这适用于国际号码;

C#:

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

JS:

/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/
Run Code Online (Sandbox Code Playgroud)


Lau*_*ves 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}$
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*Ben 9

我只检查有效字符,最多允许 30 个字符。包含分机号的号码也是可能的。

^[\+\(\s.\-\/\d\)]{5,30}$
Run Code Online (Sandbox Code Playgroud)

匹配以下内容:

(0123) 123 456 1
555-555-5555
0049 1555 532-3455
123 456 7890
0761 12 34 56
+49 123 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
Run Code Online (Sandbox Code Playgroud)


Zai*_*han 7

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

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


App*_*ppy 6

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

  1. 实际数字应该只有 10 位数字。
  2. 对于美国号码,区号可能会用括号 () 括起来。
  3. 国家/地区代码的长度可以是 1 到 3 位数字。前面可以选择加一个 + 号。
  4. 国家/地区代码、区号和号码的其余部分之间可以有破折号、空格、点或没有空格。
  5. 有效的电话号码不能全为零。

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

解释:

    ^ - 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
Run Code Online (Sandbox Code Playgroud)

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


Rou*_*man 6

我在下面使用过这个:

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

格式 +CCC.NNNNNNNNNNxEEEE 或 00CCC.NNNNNNNNNNxEEEE

\n\n

对于国际电话,电话号码必须以“+”或“00”开头。\n其中 C 是 1\xe2\x80\x933 位国家/地区代码,

\n\n

N 最多 14 位数字,

\n\n

E 是(可选)扩展名。

\n\n

前导加号和国家/地区代码后面的点是必需的。仅当提供扩展名时才需要文字 \xe2\x80\x9cx\xe2\x80\x9d 字符。

\n


Bla*_*bam 6

对这些出色的答案没有任何批评,我只想介绍我用于管理内容创建者的简单解决方案:

^(\+|00)[1-9][0-9 \-\(\)\.]{7,}$
Run Code Online (Sandbox Code Playgroud)

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


luk*_*uky 6

我为欧洲电话号码制作了正则表达式,它特定于拨号前缀与号码长度。

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"))
Run Code Online (Sandbox Code Playgroud)


Dev*_*Dev 5

修改了@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}$/
Run Code Online (Sandbox Code Playgroud)