Rețetă RegEx: Telefon RO, CNP și IBAN în Expresii Regulare (RegEx)

Rețete practice și utilizare în limbaje PCRE / ECMAScript / Python

Șabloane RegEx adaptate pentru România: numere de telefon mobil/fix (+40 / 07xx), Cod Numeric Personal (CNP) și conturi IBAN RO.

Tipar RegEx
/^(?:+?40|0)s*7d{2}[s.-]?d{3}[s.-]?d{3}$/

Ce face Rețetă RegEx: Telefon RO, CNP și IBAN

Aplicațiile de e-commerce, facturare și HR din România au nevoie constant de validarea a trei formate specifice: numărul de telefon românesc (mobil 07xx sau fix 02xx / 03xx, cu sau fără prefixul internațional +40 ori 0040), Codul Numeric Personal (CNP) de 13 cifre și codul bancar IBAN de România (24 de caractere începând cu RO).

Rețetele de mai jos sunt gândite atât pentru validarea strictă a datelor curățate de spații, cât și pentru acceptarea formatării umane cu spații, puncte sau cratime (ex. 0722 123 456 sau RO49 AAAA 1B31 ...).

Variante și sintaxă asociată

Expresie / Simbol Descriere
^(?:\+?40|0040|0) Prefixul unui număr de telefon românesc: acceptă +40, 40, 0040 sau 0 național.
7\d{2}[\s.-]?\d{3}[\s.-]?\d{3} Număr mobil RO (începe cu 7) cu separatori opționali (spațiu, punct, cratimă).
[237]\d{2} Include atât numerele mobile (07xx), cât și cele fixe (02xx și 03xx).
^[1-9]\d{2}(0[1-9]|1[0-2])... Structura CNP-ului: S (sex/secol 1-9), AA (an), LL (lună 01-12), ZZ (zi 01-31), JJ (județ), NNN, C.
^RO\d{2}[A-Z]{4}[A-Z0-9]{16}$ Formatul oficial al unui IBAN românesc (24 de caractere alfanumerice).

Exemple

Exemplul 1: Validarea numerelor de telefon din România (mobil și fix)

Acceptă formatele uzuale 0722123456, 0722 123 456, 0722-123-456, +40722123456 și numere fixe 021/031.

// Doar mobil România:
$reMobil = '/^(?:\+?40|0040|0)\s*7\d{2}[\s.-]?\d{3}[\s.-]?\d{3}$/';

// Mobil + Fix România (02xx, 03xx, 07xx):
$reTelefonRO = '/^(?:\+?40|0040|0)\s*[237]\d{2}[\s.-]?\d{3}[\s.-]?\d{3}$/';

Potriviri găsite (Matches)

"0722123456"      -> VALID (mobil)
"0744 123 456"    -> VALID (mobil cu spații)
"+40 722-123-456" -> VALID (mobil cu prefix +40)
"021 312 4567"    -> VALID pe $reTelefonRO (fix București)
"0800 123 456"    -> INVALID pe $reMobil

Exemplul 2: Validarea sintactică a CNP-ului și a contului IBAN de România

Verificăm structura calendaristică și codul de județ din CNP (13 cifre), respectiv cele 24 de caractere ale unui IBAN RO.

// CNP (13 cifre: S + AA + LL(01-12) + ZZ(01-31) + JJ(01-52,70,80,99) + NNN + C):
$reCNP = '/^[1-9]\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])(?:0[1-9]|[1-4]\d|5[0-2]|70|80|99)\d{4}$/';

// IBAN România (fără spații: RO + 2 cifre control + 4 litere bancă + 16 caractere cont):
$reIBAN = '/^RO\d{2}[A-Z]{4}[A-Z0-9]{16}$/i';

Potriviri găsite (Matches)

CNP  "1900515400123"               -> VALID sintactic (sex 1, an 90, luna 05, zi 15, județ 40)
CNP  "0901345990123"               -> INVALID (începe cu 0, luna 13, ziua 45)
IBAN "RO49AAAA1B31007593840000"    -> VALID (24 caractere: RO + 2 cifre + 4 litere + 16 alfanum)

Greșeli frecvente

  • Refuzarea spațiilor în inputul de telefon sau IBAN: utilizatorii copiază frecvent IBAN-ul grupat câte 4 caractere (RO49 AAAA 1B31...). Cea mai bună practică în UX este să elimini mai întâi spațiile cu preg_replace('/\s+/', '', $input) și apoi să aplici expresia de validare.
  • Considerarea RegEx-ului ca fiind suficient 100% pentru CNP sau IBAN: expresia regulară verifică impecabil formatul și lungimea, dar pentru validare completă în producție trebuie verificată și cifra de control (ultima cifră din CNP cu constanta 279146358279, respectiv modulo 97 pentru IBAN).

Simboluri și rețete înrudite