0Pricing
Coding Interview Prep · Lekcja

Analizowanie i formatowanie ciągów znaków

SUBSTRING, pozycje, dzielenie i zmiana wielkości liter w różnych dialektach.

Analizowanie i formatowanie ciągów znaków to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Dlaczego pojawiają się pytania o funkcje tekstowe

Rzeczywiste dane są nieuporządkowane: pełne nazwiska trzeba dzielić, z adresów e-mail wyodrębniać domeny, kody bywają osadzone w identyfikatorach, a wielkość liter jest niespójna. Osoby prowadzące rozmowy kwalifikacyjne wykorzystują operacje na tekstach, aby sprawdzić, czy potrafią Państwo oczyścić i przekształcić tekst bez eksportowania go do skryptu.

Podobnie jak w przypadku dat, funkcje te są tylko częściowo ustandaryzowane, więc celem jest znajomość koncepcji i popularnych wariantów.

  • Wyodrębnianie podciągów i wyszukiwanie pozycji
  • Łączenie tekstów
  • Dzielenie i zastępowanie
  • Zmiana wielkości liter i usuwanie zbędnych znaków

SUBSTRING i wyszukiwanie pozycji

SUBSTRING(s FROM start FOR length) to forma zgodna ze standardem SQL; większość silników akceptuje również SUBSTRING(s, start, length). Pozycje w tekście są liczone od 1, co jest klasyczną pułapką typu off-by-one dla programistów przyzwyczajonych do języków, w których indeksowanie zaczyna się od 0.

POSITION(sub IN s) (lub STRPOS/CHARINDEX) znajduje pozycję początku podciągu, zwracając 0, jeśli go nie znaleziono.

SELECT
  SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year,   -- '2024'
  POSITION('-' IN 'INV-2024-042')        AS first_dash; -- 4

Wyodrębnianie domeny adresu e-mail

To klasyczny przykład. Należy znaleźć znak @, a następnie pobrać wszystko, co znajduje się za nim. Połączenie POSITION z SUBSTRING to przenośne rozwiązanie.

W PostgreSQL można również użyć funkcji SPLIT_PART(email, '@', 2), która jest czytelniejsza i warto wspomnieć o niej jako o idiomatycznym rozwiązaniu.

-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;

-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;

Łączenie tekstów w różnych dialektach

Łączenie tekstów zależy od dialektu, a osoby prowadzące rozmowy kwalifikacyjne oczekują znajomości tych wariantów.

  • Standard SQL / Postgres / Oracle: operator ||.
  • MySQL: CONCAT(a, b, c) (operator || domyślnie oznacza logiczne LUB).
  • SQL Server: operator + dla tekstów lub funkcja CONCAT().

Funkcja CONCAT() traktuje NULL jak pusty tekst, natomiast || i + zazwyczaj powodują, że cały wynik staje się NULL, jeśli którykolwiek operand ma wartość NULL. To subtelne źródło błędów.

-- Postgres
SELECT first_name || ' ' || last_name AS full_name FROM people;

-- MySQL / SQL Server
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM people;

Pułapka konkatenacji wartości NULL

Kontynuując poprzedni przykład: jeśli last_name ma wartość NULL, wyrażenie first_name || ' ' || last_name w Postgresie zwróci NULL, usuwając całe imię i nazwisko.

Rozwiązaniem zabezpieczającym jest użycie COALESCE dla elementów, które mogą mieć wartość NULL, albo funkcji CONCAT_WS (łączenie z separatorem), która pomija wartości NULL i wstawia separator tylko między obecne wartości.

-- Safe in Postgres / MySQL
SELECT CONCAT_WS(' ', first_name, last_name) AS full_name FROM people;

-- Or guard each part
SELECT first_name || ' ' || COALESCE(last_name, '') FROM people;

Dzielenie tekstów

Pytanie „wyodrębnij trzeci segment z kodu rozdzielanego myślnikami” sprawdza umiejętność dzielenia tekstu. Funkcja PostgreSQL SPLIT_PART(s, delim, n) bezpośrednio zwraca n-ty fragment i jest najczytelniejszym narzędziem.

MySQL nie ma bezpośredniej funkcji dzielenia; stosuje się zagnieżdżone wywołania SUBSTRING_INDEX: najpierw pobiera się pierwszych n fragmentów, a następnie ostatni z nich.

-- Postgres
SELECT SPLIT_PART('a-b-c-d', '-', 3); -- 'c'

-- MySQL: third part of a-b-c-d
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a-b-c-d', '-', 3), '-', -1); -- 'c'

Zastępowanie, usuwanie zbędnych znaków i dopełnianie

Operacje czyszczenia danych, które osoby prowadzące rozmowy kwalifikacyjne oczekują znać od ręki:

  • REPLACE(s, from, to) zastępuje wszystkie wystąpienia.
  • TRIM(s) usuwa spacje z początku i końca; TRIM(BOTH 'x' FROM s) usuwa określony znak.
  • LPAD(s, len, ch) / RPAD dopełniają tekst do stałej szerokości, co przydaje się przy uzupełnianiu identyfikatorów zerami.
SELECT
  REPLACE('555.123.4567', '.', '-') AS phone,   -- 555-123-4567
  TRIM('   hello   ')               AS clean,   -- 'hello'
  LPAD('42', 6, '0')                AS padded;   -- '000042'

Zmiana wielkości liter i długość tekstu

Normalizacja wielkości liter jest niezbędna przed porównywaniem lub grupowaniem tekstu. Funkcje UPPER i LOWER są uniwersalne; INITCAP (Postgres/Oracle) zapisuje każde słowo z wielkiej litery.

LENGTH(s) w większości silników zwraca liczbę znaków, ale należy uważać: SQL Server używa LEN(), a w niektórych konfiguracjach LENGTH liczy bajty dla tekstu wielobajtowego. Warto wspomnieć o tym niuansie w przypadku danych zawierających znaki spoza ASCII.

SELECT
  LOWER(email)        AS email_norm,
  INITCAP(city)       AS city_pretty,  -- Postgres
  LENGTH(description)  AS chars
FROM places;

Dopasowywanie wzorców poza LIKE

Gdy LIKE nie jest wystarczająco elastyczne, osoby prowadzące rozmowy kwalifikacyjne chętnie sprawdzają znajomość wyrażeń regularnych. PostgreSQL udostępnia operator ~ oraz funkcje REGEXP_REPLACE / REGEXP_MATCHES; MySQL ma funkcje REGEXP / REGEXP_SUBSTR.

Przykład: pozostawienie wyłącznie cyfr w tekście numeru telefonu. Wyrażenie regularne pozwala zrobić to w jednym wierszu zamiast za pomocą całego łańcucha wywołań REPLACE.

-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
  AS digits; -- '5551234567'

Głębszy przykład: normalizacja nazw i usuwanie duplikatów

To zadanie łączy kilka operacji czyszczenia. Załóżmy, że nazwiska zawierają zbędne spacje i mają różną wielkość liter, co powoduje powstawanie pozornych duplikatów. Najpierw należy je znormalizować, a dopiero potem grupować.

Przed zliczeniem unikatowych wartości należy usunąć zbędne spacje, zredukować wewnętrzne wielokrotne spacje za pomocą wyrażenia regularnego i zamienić tekst na małe litery. To dokładnie taki wieloetapowy sposób rozumowania, który jest wysoko oceniany podczas rozmów kwalifikacyjnych.

SELECT
  LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
  COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;

Rzutowanie tekstów na liczby i daty

Kolumny tekstowe często zawierają wartości, które powinny być liczbami lub datami. CAST(s AS INTEGER) albo skrócona składnia Postgresa s::int wykonuje konwersję, ale kończy się błędem dla niepoprawnych danych wejściowych.

W przypadku dat funkcja TO_DATE(s, 'YYYY-MM-DD') (Postgres/Oracle) analizuje tekst z użyciem jawnego wzorca formatu. To najbezpieczniejsze podejście, ponieważ usuwa niejednoznaczność kolejności dnia i miesiąca.

SELECT
  CAST(qty_text AS INTEGER)            AS qty,
  TO_DATE(order_str, 'DD/MM/YYYY')     AS order_date
FROM staging;

Szybkie sprawdzenie

Proszę przeanalizować zachowanie wartości NULL podczas łączenia tekstów.

Podsumowanie: analizowanie i formatowanie tekstów

Najważniejsze informacje, które warto zapamiętać przed rozmową kwalifikacyjną:

  • Pozycje w tekście są liczone od 1; funkcje SUBSTRING + POSITION wyodrębniają fragmenty na podstawie pozycji.
  • Teksty należy łączyć za pomocą || (Postgres), CONCAT (MySQL) lub + (SQL Server), pamiętając o propagacji wartości NULL; warto preferować CONCAT_WS.
  • Teksty należy dzielić za pomocą SPLIT_PART (Postgres) lub zagnieżdżonych wywołań SUBSTRING_INDEX (MySQL).
  • Funkcje REPLACE, TRIM, LPAD, UPPER/LOWER służą do czyszczenia i normalizacji; wyrażenia regularne obsługują trudniejsze przypadki.
  • Wielkość liter i odstępy należy znormalizować przed grupowaniem, aby uniknąć pozornych duplikatów.

Często zadawane pytania

Czy lekcja „Analizowanie i formatowanie ciągów znaków” jest bezpłatna?

Tak — pełny tekst „Analizowanie i formatowanie ciągów znaków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Analizowanie i formatowanie ciągów znaków”?

SUBSTRING, pozycje, dzielenie i zmiana wielkości liter w różnych dialektach. Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?

Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Analizowanie i formatowanie ciągów znaków”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?

Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Działania na datach i interwały
  2. Obcinanie i grupowanie dat
  3. Analizowanie i formatowanie ciągów znaków
  4. Strefy czasowe i znaczniki czasu
← Powrót do Coding Interview Prep