Hladový regex při rozdělení předvolby telefonu sní číslici
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”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.
Root cause
Sekce “Root cause”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.
Fix
Sekce “Fix”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ětUPDATE 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
recombinedal 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.