Č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