web-dev-qa-db-fra.com

Quelle expression régulière correspondra à des numéros de téléphone internationaux valides?

Je dois déterminer si un numéro de téléphone est valide avant d'essayer de le composer. L'appel téléphonique peut aller n'importe où dans le monde.

Quelle expression régulière correspondra à des numéros de téléphone internationaux valides?

87
Abtin Forouzandeh
\+(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}$

Le format correct pour faire correspondre un numéro de téléphone international générique. J'ai remplacé le code d'accès international 011 centré sur la ligne terrestre aux États-Unis par l'identifiant de code d'accès international standard «+», le rendant obligatoire. J'ai également changé le minimum pour le numéro national à au moins un chiffre.

Notez que si vous entrez des numéros dans ce format dans le carnet d'adresses de votre téléphone portable, vous pouvez appeler n'importe quel numéro de votre carnet d'adresses avec succès, peu importe votre destination. Pour les lignes terrestres, remplacez le plus par le code d'accès international du pays que vous appelez.

Notez que cela NE tient PAS compte des règles des plans de numérotation nationaux. En particulier, cela autorise les zéros et les emplacements que les plans de numérotation nationaux ne permettent pas, ainsi que les longueurs de numéro supérieures au plan de numérotation national pour certains pays (les États-Unis, par exemple).

74
Eric

Tous les codes de pays sont définis par l'UIT. La regex suivante est basée sur les Recommandations UIT-T E.164 et du Bulletin d'exploitation de l'UIT N ° 930 - 15.IV.2009 . Il contient tous les codes de pays actuels et les codes réservés pour une utilisation future. Bien que cela puisse être un peu raccourci, j'ai décidé d'inclure chaque code indépendamment.

Ceci est pour les appels en provenance des Etats-Unis. Pour les autres pays, remplacez le code d'accès international (le 011 au début de la regex) par celui qui convient pour le pays plan de numérotation .

Notez également que ITU E.164 définit la longueur maximale d’un numéro de téléphone international complet à 15 chiffres. Cela signifie qu'un code de pays à trois chiffres donne jusqu'à 12 chiffres supplémentaires, et qu'un code de pays à 1 chiffre peut contenir jusqu'à 14 chiffres supplémentaires. D'où le

[0-9]{0,14}$

a la fin de la regex.

Plus important encore, cette expression rationnelle ne signifie pas que le numéro est valide - chaque pays définit son propre plan de numérotation interne. Cela garantit uniquement que le code pays est valide.

^ 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 | 895 | 895 | 894 | 893 | 892 | 891 | 890 | 889 | 888 | 88 | 886 | 885 | 884 | 883 | 882 | 881 | 880 | 879 | 878 | 877 | 876 | 875 | 874 | 873 | 872 | 871 | 870 | 859 | 858 | 857 | 856 | 85 | 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 | 687 | 685 | 684 | 683 | 682 | 68 | 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 | 47 | 46 | 45 | 44 | 43 | 41 | 40 | 39 | 36 | 34 | 33 | 32 | 31 | 30 | 27 | 20 | 7 | 1) [0-9] {0, 14} $

66
Abtin Forouzandeh

Ceci est une optimisation supplémentaire. 

\+(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) autorise les préfixes internationaux valides
(ii) suivi de 9 ou 10 chiffres, avec tout type ou placement de délimètres (sauf entre les deux derniers chiffres)

Cela correspondra à:
+ 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 

29
fezfox

Vous pouvez utiliser la bibliothèque libphonenumber de Google.

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

Voici une version "optimisée" de votre 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}$

Vous pouvez remplacer le \ds par [0-9] si votre syntaxe regex ne prend pas en charge \d.

10
Laurence Gonsalves

J'utilise celui-ci:

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

Avantages: reconnaît + ou 011 débuts, le laisse aussi longtemps que nécessaire et gère de nombreuses conventions d’extension. (#, x, ext, extension)

7
TOBlender

Cela fonctionnera pour les numéros internationaux;

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

Pour iOS Swift J'ai trouvé cela utile,

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

Expression régulière de @ Eric modifiée - ajout d'une liste de tous les codes de pays (les obtenir de xxxdepy @ Github . J'espère que vous le trouverez utile:

/(\+|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}$/
4
Dev

Il y a évidemment une multitude de façons de le faire, comme le prouvent toutes les différentes réponses données jusqu'à présent, mais je vais ajouter ma valeur de 0,02 $ ici et fournir la regex ci-dessous, ce qui est un peu plus concis que presque tout ce qui précède. , mais plus complet que la plupart aussi. Il a également pour effet secondaire de laisser le code de pays en $ 1 et le numéro local en $ 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 +) $

2
trekinaz

Voici un regex pour les scénarios de numéros de téléphone les plus courants suivants. Bien que cela soit adapté du point de vue américain pour les indicatifs régionaux, cela fonctionne pour les scénarios internationaux.

  1. Le nombre réel devrait être de 10 chiffres seulement. 
  2. Pour les numéros américains, l'indicatif régional peut être entouré de parenthèses (). 
  3. Le code de pays peut comporter de 1 à 3 chiffres. Peut éventuellement être précédé d'un signe +. 
  4. Il peut y avoir des tirets, des espaces, des points ou aucun espace entre le code de pays, l'indicatif régional et le reste du numéro. 
  5. Un numéro de téléphone valide ne peut pas être composé de zéros. 

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

Explication: 

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

Plus d'exemples et d'explications - https://regex101.com/r/hTH8Ct/2/

1
Appy
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();
}
1
Cássio

Une version simple pour les numéros européens, qui correspond aux numéros 0034617393211 mais aussi longs que 004401484172842.

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

J'espère que ça aide :·)

1
Roc Boronat

Le plan de numérotage international est basé sur le plan de numérotage ITU E.164 . Je suppose que c'est le point de départ de votre expression habituelle.

Je mettrai à jour cette information si je parviens à créer une expression régulière basée sur la numérotation ITU E.164.

0
Buhake Sindi

Même si cela n’utilise pas vraiment RegExp pour faire le travail - ou peut-être à cause de cela - cela me semble une solution intéressante: https://intl-tel-input.com/node_modules/intl-tel-input /examples/gen/is-valid-number.html

0
Tony Vlcek

Essayez ceci, cela fonctionne pour moi.

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

Cela fonctionne pour moi, sans les préfixes 00, 001, 0011, etc.:

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

Essayez l’API suivante pour la validation du numéro de téléphone . Cela renverra également le pays, la région et le fournisseur.

demo https://libphonenumber.appspot.com/

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

0
Gagan Ahuja