přeskočit na obsah
[JJ]
zpět na snippety
regexregexczechvalidationjavascript28. 3. 2026

Regex pro české validátory (IČO, RČ, telefon)

Validační regexy pro IČO, rodné číslo, české telefonní číslo a PSČ. Inline + JS variant s checksumy.

České validátory mi pořád někdo plete. Nezachytávám tady business logic (modulo 11 pro IČO), jen syntaxi. Pro skutečnou validaci přidej checksum.

Patterns

regex
# IČO — přesně 8 číslic
^\d{8}$

# Rodné číslo (s lomítkem) — 6 číslic / 3-4 číslice
^(\d{2})(\d{2})(\d{2})\/(\d{3,4})$

# Telefon CZ — +420 / 00420 / 0 prefix, mezery povolené
^(?:\+420|00420|0)?\s?[1-9]\d{2}\s?\d{3}\s?\d{3}$

# PSČ — 5 číslic, mezera mezi 3. a 4.
^\d{3}\s?\d{2}$

TypeScript helper s checksumy

ts
export function isValidICO(ico: string): boolean {
  if (!/^\d{8}$/.test(ico)) return false;
  const digits = ico.split('').map(Number);
  const weights = [8, 7, 6, 5, 4, 3, 2];
  const sum = digits.slice(0, 7).reduce((acc, d, i) => acc + d * weights[i], 0);
  const mod = sum % 11;
  const check = (11 - mod) % 10;
  return check === digits[7];
}

export function isValidRC(rc: string): boolean {
  const m = rc.match(/^(\d{2})(\d{2})(\d{2})\/?(\d{3,4})$/);
  if (!m) return false;
  const [, yy, mm, dd, ext] = m;
  // RČ od 1954 dál má 4 číslice za lomítkem a musí být dělitelné 11
  if (ext.length === 4) {
    const num = parseInt(yy + mm + dd + ext, 10);
    if (num % 11 !== 0) return false;
  }
  // Datum kontrola
  const month = parseInt(mm, 10);
  const realMonth = month > 50 ? month - 50 : month > 20 ? month - 20 : month;
  if (realMonth < 1 || realMonth > 12) return false;
  const day = parseInt(dd, 10);
  if (day < 1 || day > 31) return false;
  return true;
}

export function normalizePhoneCZ(input: string): string | null {
  const cleaned = input.replace(/\s+/g, '');
  const m = cleaned.match(/^(?:\+420|00420|0)?([1-9]\d{2}\d{3}\d{3})$/);
  if (!m) return null;
  return '+420 ' + m[1].replace(/(\d{3})(\d{3})(\d{3})/, '$1 $2 $3');
}

Testovací vektory

ts
// Tyto IČO existují a mají valid checksum
isValidICO('07387156'); // true — ZEMAN maso - uzeniny
isValidICO('24409979'); // true — ajtak.it (Julius Joska)
isValidICO('00000000'); // true — checksum projde, ale není to firma

normalizePhoneCZ('+420 777 123 456'); // "+420 777 123 456"
normalizePhoneCZ('0777123456');        // "+420 777 123 456"
normalizePhoneCZ('777 123 456');       // "+420 777 123 456"
normalizePhoneCZ('123');               // null