Rexact
Cheatsheet

Regex South African phone number

ICASA states that South African numbers are 10 digits long: the trunk 0 followed by 9 digits, with +27 replacing the 0 from abroad. The two digits after the 0 designate an area code (011 Johannesburg, 021 Cape Town, 031 Durban, 012 Pretoria), a mobile operator (06x, 07x, 08x) or a service (0800 toll-free, 086x, 087x, 09x). The real attempts I read accept any prefix: validator.js's regex accepts '000000000', sent.dm's only refuses 00, and Drupal's accepts numbers starting with 99. Here's a pattern bounding the first two digits, compared against those attempts.

/^(?:(?:\+|00)27[ -]?|0)(?:1[0-8]|2[1-378]|3[1-69]|4[0-9]|5[1346-8]|[67][0-9]|8[0-7]|9[0-2])(?:[ -]?[0-9]){7}$/
passes 34/34 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^(?:(?:\\+|00)27[ -]?|0)(?:1[0-8]|2[1-378]|3[1-69]|4[0-9]|5[1346-8]|[67][0-9]|8[0-7]|9[0-2])(?:[ -]?[0-9]){7}$", "");
re.test(input);

Limits

  • Valide seulement la FORME : ne vérifie pas que le numéro est attribué. Les préfixes de 2 chiffres suivent libphonenumber ; le texte des National Numbering Plan Regulations 2016 de l'ICASA, qui fait foi pour les blocs attribués, n'a pas été relu (seule la page « Numbering » l'a été).
  • La longueur de 10 chiffres avec le 0 est celle de l'ICASA ; les numéros de 14 chiffres (machine à machine) et les codes courts (moins de 10 chiffres) sont rejetés. Les préfixes 088, 089 et 91x-99x sont rejetés ; 09 n'est accepté que pour 090 à 092.
  • Après +27 ou 0027, le 0 de tronc ne doit pas être gardé : « +27 011… » est rejeté.
  • Une espace ou un tiret facultatifs sont acceptés entre deux chiffres quelconques ; les parenthèses, points et extensions sont rejetés.

Phone numbers for other countries

Related pages