Разбор и форматирование строк
SUBSTRING, позиция, разделение и изменение регистра в разных диалектах
«Разбор и форматирование строк» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Почему спрашивают о строковых функциях
Реальные данные бывают неаккуратными: полные имена нужно разделять, из адресов электронной почты — извлекать домены, в идентификаторах могут быть встроены коды, а регистр символов бывает неоднородным. Интервьюеры используют обработку строк, чтобы проверить, умеете ли Вы очищать и преобразовывать текст без выгрузки данных в отдельную программу.
Как и в случае с датами, функции стандартизированы лишь частично, поэтому важно знать концепцию и распространенные варианты.
- Извлечение подстрок и определение позиции
- Объединение строк
- Разделение и замена
- Преобразование регистра и удаление пробелов по краям
SUBSTRING и определение позиции
SUBSTRING(s FROM start FOR length) — форма, соответствующая стандарту SQL; большинство систем также принимает SUBSTRING(s, start, length). Позиции в строках отсчитываются от единицы — это классическая ошибка смещения на единицу для программистов, привыкших к языкам с отсчетом от нуля.
POSITION(sub IN s) (или STRPOS/CHARINDEX) находит позицию начала подстроки и возвращает 0, если подстрока не найдена.
SELECT
SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year, -- '2024'
POSITION('-' IN 'INV-2024-042') AS first_dash; -- 4Извлечение домена электронной почты
Классический разобранный пример. Найдите символ @, затем возьмите всё после него. Сочетание POSITION и SUBSTRING — универсальный подход.
В PostgreSQL также можно использовать SPLIT_PART(email, '@', 2): такой вариант читается понятнее, и его стоит назвать идиоматичным решением.
-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;
-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;Объединение строк в разных диалектах
Объединение строк зависит от диалекта, и интервьюеры ожидают, что Вы знаете различия.
- Стандарт SQL, PostgreSQL и Oracle: оператор
||. - MySQL:
CONCAT(a, b, c)(оператор||по умолчанию является логическим OR). - SQL Server:
+для строк илиCONCAT().
CONCAT() обрабатывает NULL как пустую строку, тогда как || и + обычно превращают весь результат в NULL, если любой операнд равен NULL. Это может стать источником трудноуловимой ошибки.
-- 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;Ловушка конкатенации с NULL
Продолжая предыдущий пример: если last_name равен NULL, выражение first_name || ' ' || last_name в PostgreSQL возвращает NULL и уничтожает всё имя.
Защитное решение — применить COALESCE к частям, которые могут содержать NULL, или использовать CONCAT_WS (объединение с разделителем): эта функция пропускает NULL и вставляет разделитель только между присутствующими значениями.
-- 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;Разделение строк
Задача «извлечь третий сегмент из кода с дефисами» проверяет умение разделять строки. В PostgreSQL функция SPLIT_PART(s, delim, n) напрямую возвращает часть с указанным номером и является самым удобным инструментом.
В MySQL нет прямой функции разделения; идиоматичный прием — вложенные вызовы SUBSTRING_INDEX: взять первые n частей, а затем последнюю из них.
-- 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'Замена, удаление пробелов и дополнение
Операции очистки, которые интервьюеры ожидают увидеть сразу:
REPLACE(s, from, to)заменяет все вхождения.TRIM(s)удаляет начальные и конечные пробелы;TRIM(BOTH 'x' FROM s)удаляет указанный символ.LPAD(s, len, ch)/RPADдополняют значение до фиксированной ширины — это удобно для добавления нулей к идентификаторам.
SELECT
REPLACE('555.123.4567', '.', '-') AS phone, -- 555-123-4567
TRIM(' hello ') AS clean, -- 'hello'
LPAD('42', 6, '0') AS padded; -- '000042'Преобразование регистра и длина
Нормализация регистра необходима перед сравнением или группировкой текста. UPPER и LOWER поддерживаются повсеместно; INITCAP (PostgreSQL и Oracle) делает первые буквы слов заглавными.
LENGTH(s) в большинстве систем возвращает количество символов, но следует помнить: в SQL Server используется LEN(), а в некоторых конфигурациях LENGTH считает байты для многобайтного текста. Упомяните эту особенность при работе с данными, содержащими символы вне ASCII.
SELECT
LOWER(email) AS email_norm,
INITCAP(city) AS city_pretty, -- Postgres
LENGTH(description) AS chars
FROM places;Сопоставление с шаблоном за пределами LIKE
Когда возможностей LIKE недостаточно, интервьюеры любят проверить знание регулярных выражений. В PostgreSQL есть оператор ~ и функции REGEXP_REPLACE / REGEXP_MATCHES; в MySQL — REGEXP / REGEXP_SUBSTR.
Например, можно оставить в строке с номером телефона только цифры. Регулярное выражение позволяет сделать это в одну строку вместо цепочки вызовов REPLACE.
-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
AS digits; -- '5551234567'Более глубокий пример: нормализация и удаление дубликатов имен
Комбинированная задача по очистке данных. Представьте, что имена приходят с лишними пробелами и неоднородным регистром, из-за чего появляются ложные дубликаты. Сначала нормализуйте данные, затем выполните группировку.
Удалите пробелы по краям, сверните внутренние последовательности пробелов с помощью регулярного выражения и переведите текст в нижний регистр перед подсчетом уникальных значений. Именно такое многошаговое рассуждение интервьюеры оценивают особенно высоко.
SELECT
LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;Приведение строк к числам и датам
Строковые столбцы часто содержат значения, которые должны быть числами или датами. CAST(s AS INTEGER) или сокращенная запись PostgreSQL s::int выполняет преобразование, но завершается ошибкой на некорректных входных данных.
Для дат функция TO_DATE(s, 'YYYY-MM-DD') (PostgreSQL и Oracle) разбирает значение по явно заданной маске формата. Это самый безопасный подход, поскольку он устраняет неоднозначность порядка дня и месяца.
SELECT
CAST(qty_text AS INTEGER) AS qty,
TO_DATE(order_str, 'DD/MM/YYYY') AS order_date
FROM staging;Быстрая проверка
Рассуждайте о поведении NULL при объединении строк.
Повторение: разбор и форматирование строк
Ключевые моменты, которые следует запомнить перед собеседованием:
- Позиции в строках отсчитываются от единицы; сочетание
SUBSTRINGиPOSITIONпозволяет извлекать значения по позиции. - Объединяйте строки с помощью
||(PostgreSQL),CONCAT(MySQL) или+(SQL Server) и помните о распространении NULL; предпочтительно использоватьCONCAT_WS. - Разделяйте строки с помощью
SPLIT_PART(PostgreSQL) или вложенных вызововSUBSTRING_INDEX(MySQL). REPLACE,TRIM,LPAD,UPPER/LOWERочищают и нормализуют данные; регулярные выражения справляются со сложными случаями.- Нормализуйте регистр и пробелы до группировки, чтобы избежать ложных дубликатов.
Часто задаваемые вопросы
Урок «Разбор и форматирование строк» бесплатный?
Да — полный текст урока «Разбор и форматирование строк» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Разбор и форматирование строк»?
SUBSTRING, позиция, разделение и изменение регистра в разных диалектах Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Разбор и форматирование строк»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Арифметика дат и интервалы
- Округление дат и распределение по интервалам
- Разбор и форматирование строк
- Часовые пояса и временные метки