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?
\+(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).
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} $
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
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();
}
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 \d
s par [0-9]
si votre syntaxe regex ne prend pas en charge \d
.
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)
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}((\\#)|())$"
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}$/
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 +) $
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.
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/
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();
}
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 :·)
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.
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
Essayez ceci, cela fonctionne pour moi.
^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
Cela fonctionne pour moi, sans les préfixes 00, 001, 0011, etc.:
/^\+*(\d{3})*[0-9,\-]{8,}/
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