Regex Japanese phone number
A Japanese number has 10 digits (landline, with a 1-to-5-digit area code) or 11 (mobile 070, 080, 090; 0800). With +81, the leading 0 disappears. The real attempts I read accept nonexistent prefixes: sent.dm's accepts '010-1234-5678' (010 is the international access prefix), '030-1234-5678' and '090-0123-4567' (a mobile's 4th digit is never 0), and refuses every +81 form. validator.js's only covers mobiles. Here's a pattern handling the three families and the +81 format, compared against those attempts.
/^(?: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})$/passes 26/26 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
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);Limits
- 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.