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 de tenter 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?

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

    Est le format correct pour faire correspondre un numéro de téléphone international générique. J’ai remplacé le code d’access international centré sur les lignes terrestres des États-Unis 011 par l’identificateur de code d’access international standard «+», le rendant ainsi obligatoire. J’ai également changé le minimum pour le numéro national à au moins un chiffre.

    Notez que si vous entrez des chiffres dans ce format dans votre carnet d’adresses de téléphone portable, vous pouvez appeler n’importe quel numéro de votre carnet d’adresses, quel que soit le lieu de votre voyage. Pour les lignes terrestres, remplacez le plus par le code d’access international du pays à partir duquel vous composez le numéro.

    Notez que cela ne tient PAS compte des règles du plan de numérotage national – en particulier, il autorise les zéros et les emplacements que les plans de numérotage nationaux ne permettent pas et autorise des longueurs de numéros supérieures au plan de numérotage national de certains pays

    Tous les codes de pays sont définis par l’UIT. L’expression rationnelle suivante est basée sur l’UIT-T E.164 et l’ annexe du Bulletin d’exploitation de l’UIT No 930 – 15.IV.2009 . Il contient tous les codes de pays et codes actuels réservés à une utilisation future. Bien que cela puisse être raccourci un peu, j’ai décidé d’inclure chaque code indépendamment.

    Ceci est pour les appels provenant des États-Unis. Pour les autres pays, remplacez le code d’access international (le 011 au début de l’expression rationnelle) par tout ce qui est approprié pour le plan de numérotation de ce pays.

    Notez également que l’UIT 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 du regex.

    Plus important encore, cette regex ne signifie pas que le nombre est valide – chaque pays définit son propre plan de numérotation interne. Cela garantit uniquement que le code du 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 | 896 | 896 | 895 | 893 | 893 | 892 | 891 | 890 | 889 | 888 | 887 | 886 | 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 | 677 | 676 | 676 | 676 | | 595 | 594 | 593 | 592 | 591 | 590 | 509 | 508 | 506 | 506 | 505 | 505 | 503 | 502 | 501 | 500 | 429 | 428 | 427 | 426 | 425 | | 420 | 389 | 388 | 387 | 386 | 385 | 384 | 383 | 382 | 381 | 380 | 379 | 378 | 377 | 376 | 375 | 374 | 373 | 372 | 371 | 370 | 359 | 358 | 357 | | 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 | 2 26 | 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} $

    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 des préfixes internationaux valides
    (ii) suivi de 9 ou 10 chiffres, avec n’importe quel type ou placement de délimiteurs (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

    Vous pouvez utiliser la bibliothèque libphonenumber de Google.

     PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); Ssortingng decodedNumber = null; PhoneNumber number; try { number = phoneNumberUtil.parse(encodedHeader, null); decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164); } catch (NumberParseException e) { e.printStackTrace(); } 

    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 les \d s par [0-9] si votre syntaxe regex ne supporte pas \d .

    J’utilise celui-ci:

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

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

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

    Pour iOS SWIFT, j’ai trouvé cela utile,

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

    Il y a évidemment une multitude de façons de le faire, comme en témoignent toutes les différentes réponses données jusqu’ici, mais je vais lancer ma valeur de 0,02 $ ici et fournir la regex ci-dessous, qui est un peu plus concise que presque toutes les réponses ci-dessus. , mais plus approfondie que la plupart des autres. Il a également le bon effet secondaire de laisser le code du 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 +) $

    Modifié @ l’expression régulière d’Eric – ajouté une liste de tous les codes de pays (les a obtenus de xxxdepy @ Github . J’espère que vous trouverez cela 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}$/ 

    Une version simple pour les nombres européens, qui correspond aux nombres comme 0034617393211 mais aussi les plus longs comme 004401484172842.

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

    J’espère que cela aide :·)

     public static boolean validateInternationalPhoneNumberFormat(Ssortingng phone) { SsortingngBuilder sb = new SsortingngBuilder(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.comstack(sb.toSsortingng()).matcher(phone).find(); } 

    Le plan de numérotage international est basé sur le plan de numérotage UIT E.164 . Je suppose que c’est le sharepoint départ de votre expression régulière.

    Je mettrai à jour ceci si je me déplace pour créer une expression régulière basée sur la numérotation ITU E.164.

    Cette expression Regex fonctionne pour les numéros de téléphone Inde, Canada, Europe, Nouvelle-Zélande, Australie, États-Unis, ainsi que leurs codes de pays:

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

    Cela fonctionne pour moi, sans 00, 001, 0011 etc préfixe si:

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

    Voici une expression rationnelle pour les scénarios de numéros de téléphone les plus courants suivants. Bien que cela soit adapté du sharepoint vue des États-Unis pour les codes régionaux, cela fonctionne pour des 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 pays peut comporter de 1 à 3 chiffres. Vous pouvez é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 du pays, l’indicatif régional et le rest 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/

    J’ai utilisé ceci ci-dessous:

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

    Le format + CCC.NNNNNNNNNNxEEEE ou 00CCC.NNNNNNNNNNxEEEE

    Le numéro de téléphone doit commencer par «+» ou «00» pour un appel international. où C est le code de pays à 1 ou 3 chiffres,

    N est jusqu’à 14 chiffres,

    et E est l’extension (facultative).

    Le signe plus et le point suivant le code du pays sont requirejs. Le caractère littéral «x» n’est requirejs que si une extension est fournie.

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

    Essayez l’API suivante pour la validation des numéros de téléphone. En outre, cela retournera le pays, la région et le fournisseur

    démo https://libphonenumber.appspot.com/

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

    Essayez ceci, je ne sais pas s’il y a un numéro de téléphone plus long que 12:

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