Regex numéro de téléphone japonais
Un numéro japonais compte 10 chiffres (fixe, avec un indicatif de 1 à 5 chiffres) ou 11 (mobile 070, 080, 090 ; 0800). Avec +81, le 0 initial disparaît. Les tentatives réelles que j'ai relues acceptent des préfixes inexistants : celle de sent.dm accepte « 010-1234-5678 » (010 est le préfixe de l'international), « 030-1234-5678 » et « 090-0123-4567 » (le 4e chiffre d'un mobile n'est jamais 0), et refuse toutes les formes +81. Celle de validator.js ne couvre que les mobiles. Voici un motif qui gère les trois familles et le format +81, comparé à ces tentatives.
/^(?:0|\+81[ -]?)(?:[789]0-?[1-9](?:-?[0-9]){7}|(?![789]0|120|800|50)[1-9](?:-?[0-9]){8}|120(?:-?[0-9]){6}|800(?:-?[0-9]){7})$/passe 26/26 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js (ja-JP) — mobiles seulement, tiret ou espace facultatifs : accepte 090-0123-4567 (4e chiffre 0) et le préfixe 060, pas encore en service ; rejette tout fixe | ^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$ | 17 / 26 | sûr |
| sent.dm (guide du fournisseur, trois regex réunies par |) — « 0\d{1,4}-?\d{1,4}-?\d{4} » accepte presque tout préfixe : 010-1234-5678, 030-1234-5678, 00-1234-5678 passent ; aucune forme +81 | ^(070|080|090)-?\d{4}-?\d{4}$|^0\d{1,4}-?\d{1,4}-?\d{4}$|^(0120|0800)-?\d{3}-?\d{3,4}$ | 18 / 26 | sûr |
| japhonex (npm, obscur) — formats avec tirets seulement, aucune forme +81 ni sans tiret ; la 2e branche n'exige pas de 0 initial : « 123-4567-8901 » passe ; « 010-1234-5678 » et « 090-0123-4567 » passent | (^0([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9]{1})-[0-9]{4}$)|(^[0-9]{3}-[0-9]{4}-[0-9]{4}$)|(^0120-([0-9]-[0-9]{5}|[0-9]{2}-[0-9]{4}|[0-9]{3}-[0-9]{3}|[0-9]{4}-[0-9]{2}|[0-9]{5}-[0-9]|[0-9]{6})$) | 16 / 26 | sûr |
Implémentation
const re = new RegExp("^(?:0|\\+81[ -]?)(?:[789]0-?[1-9](?:-?[0-9]){7}|(?![789]0|120|800|50)[1-9](?:-?[0-9]){8}|120(?:-?[0-9]){6}|800(?:-?[0-9]){7})$", "");
re.test(input);Limites
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué ni que l'indicatif régional existe : « 099-123-4567 » (un fixe de format valide) passe. Les longueurs viennent des métadonnées de libphonenumber, la page du ministère consultée ne les donnant pas.
- Le préfixe 060 (mobile, ajouté au plan en décembre 2024) est rejeté parce que son lancement a été reporté d'après les opérateurs (annonce de juillet 2026) : ajoutez 6 à la classe [789] le jour où il est en service.
- Les numéros 050 (IP), 0800 et 0120 sont acceptés mais pas les services à numérotation spéciale (0570, 0990…) : ils sont rejetés. Le préfixe +81 est accepté avec un tiret ou une espace, sans le 0 initial : « +81 090-… » est rejeté.
- Tirets facultatifs, placés n'importe où entre les chiffres : « 0-3-1-2-3… » est donc accepté. Les chiffres pleine chasse sont rejetés ; normalisez avant validation.