Rexact
Cheatsheet

Regex Polish phone number

Poland has a closed 9-digit plan with no trunk prefix: you always dial all 9 digits, with or without +48. The first two digits designate either a geographic zone (12 Kraków, 22 Warsaw) or a mobile operator (50, 51, 53, 60, 66, 69, 72, 78, 79, 88...). Not all pairs are allocated: 01, 20, 40 or 99 do not exist. The real attempts I read accept any 9 digits (CakePHP, sent.dm), or refuse separators (jquery-validation, which strips spaces first), or cover only mobiles (validator.js). Here's a pattern bounding the first two digits, compared against those attempts.

/^(?:(?:\+|00)48 ?)?(?:(?:1[2-8]|2[2-69]|3[2-49]|4[1-8]|5[0-9]|6[0-35-9]|7[1-9]|8[1-9]|9[145])(?:[ -]?[0-9]){7}|800(?:[ -]?[0-9]){6,7}|801(?:[ -]?[0-9]){6}|70[01346-8](?:[ -]?[0-9]){6})$/
passes 33/33 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^(?:(?:\\+|00)48 ?)?(?:(?:1[2-8]|2[2-69]|3[2-49]|4[1-8]|5[0-9]|6[0-35-9]|7[1-9]|8[1-9]|9[145])(?:[ -]?[0-9]){7}|800(?:[ -]?[0-9]){6,7}|801(?:[ -]?[0-9]){6}|70[01346-8](?:[ -]?[0-9]){6})$", "");
re.test(input);

Limits

  • Valide seulement la FORME : ne vérifie pas que le numéro est attribué. Seuls les deux premiers chiffres sont contrôlés, avec la liste des zones et opérateurs de l'ITU et de libphonenumber ; les troisième et quatrième chiffres (certains blocs mobiles ou 21x) ne le sont pas.
  • Il n'y a pas de préfixe de tronc : les 9 chiffres se composent toujours, donc « +48 012… » et « 012… » sont rejetés. L'espace après +48 est facultative.
  • Les numéros 800 (9 ou 10 chiffres), 801 et 70x sont acceptés ; les numéros anciens à 6 ou 7 chiffres (« 22 123 45 ») et le préfixe 804 ne le sont pas. Le préfixe 39 (VoIP) est accepté.
  • Une espace ou un tiret facultatifs sont acceptés entre deux chiffres quelconques après les deux premiers : « 12 3 4 5 6 7 8 9 » passe.

Phone numbers for other countries

Related pages