Přeskočit na obsah

Hladový regex při rozdělení předvolby telefonu sní číslici

import { Aside } from ‘@astrojs/starlight/components’;

Na části uživatelských účtů chybí v telefonním čísle jedna (nebo víc) vedoucích číslic — z 771167632 se stane 71167632. Předvolba u nich vypadá nesmyslně (+4207 místo +420). Projeví se hromadně až po datové migraci/úklidu, ne hned.

Backfill, který oddělil mezinárodní předvolbu od národního čísla u sloučených čísel typu +420771676321:

UPDATE profiles SET
phone_prefix = (regexp_match(phone, '^(\+\d{1,4})'))[1],
phone = regexp_replace(phone, '^\+\d{1,4}\s*', '')
WHERE phone ~ '^\+' AND (phone_prefix IS NULL OR phone_prefix = '');

\d{1,4} je hladový — u čísla bez mezery sebere maximum, tj. 4 číslice: +4207. Skutečný country code je ale +420 (3 číslice), takže čtvrtá číslice (7) = první číslice národního čísla skončila v předvolbě a z phone zmizela. Počet snědených číslic = 4 − délka_country_code (u +49 se snědly 2, u +1 tři). Čísla s mezerou (+420 771...) se rozdělila správně, protože regex narazil na nečíslici.

Bezeztrátová reverze — pro každý CC délku zvlášť, nebo prostě vrátit původní řetězec:

-- jednoznačné 3místné CC: vrať snědenou číslici zpět
UPDATE profiles SET
phone = substring(phone_prefix || phone from 5), -- za "+420"
phone_prefix = left(phone_prefix, 4)
WHERE phone_prefix ~ '^\+(420|421|380)[0-9]$';
-- nejednoznačné: slož celé číslo zpět do phone (žádná chybějící číslice)
UPDATE profiles SET phone = phone_prefix || phone, phone_prefix = ''
WHERE phone_prefix ~ '^\+[0-9]{4}$';

Pár účtů, kde někdo mezitím ručně „opravil” předvolbu na +420 (ale telefonu zůstala chybět číslice), se dorovnalo z původního exportu (authoritative source) — porovnáním, kde current je suffixem export_national a kratší.

Jak se tomu vyvarovat v jiných systémech

Sekce “Jak se tomu vyvarovat v jiných systémech”
  • Detection: SELECT phone_prefix, count(*) ... GROUP BY 1 — předvolba + a 4+ číslic je červená vlajka (žádný country code není 4místný). Délka národního čísla < očekávané (CZ mobil = 9).
  • Anti-pattern: \d{1,4} / \d+ na country code; jakýkoli destruktivní split bez zálohy předchozího stavu a bez reverzibility.
  • Lepší přístup: parsovat telefon knihovnou s tabulkou předvoleb (libphonenumber), ne regexem; každý datový backfill psát jako reverzibilní (ulož původní hodnotu / nebo tak, aby recombine dal přesně originál); ověřit na dry-run vzorku proti authoritative zdroji PŘED hromadným UPDATE.

Sister bugs / související

Sekce “Sister bugs / související”

Stejná rodina: jakýkoli „chytrý” split/normalizace nad legacy daty bez zálohy (jména, adresy, IBAN). Vždy nejdřív dry-run + záloha + porovnání s původním exportem.

Přidal aiarchitekt.cz · 14. 6. 2026 2:00
Provozuje aiarchitekt.cz