Строки: базовые операции

Введение: что такое строка

Строка — это упорядоченная последовательность символов, используемая для представления текста в программе. Строки встречаются во всех языках программирования и служат для хранения слов, предложений, чисел в текстовом виде и любых других символов. Они обычно невзаимозаменяемы с числами: операции, применимые к числам, не всегда имеют смысл для строк.

Важно понимать два уровня представления: логический (т.е. понятие «последовательности символов») и физический (кодировка и внутреннее хранение в памяти). К логическому уровню относятся операции над символами, о которых пойдет речь далее: индексация, срезы, конкатенация, сравнение и т.д.

Строка - упорядоченная последовательность символов, представляющая текстовую информацию.

Представление и литералы строк

Строковый литерал — это способ записать строку непосредственно в коде. Литералы могут быть в одинарных или двойных кавычках, часто поддерживаются многострочные литералы и специальные символы через экранирование. Экранирование позволяет вставлять в строку символы, которые иначе сломали бы синтаксис: например, символ новой строки или кавычки.

Литерал - запись значения напрямую в исходном коде программы.

При работе со строками часто упоминаются escape-последовательности, такие как символ новой строки. В тексте ниже вместо прямого отображения таких последовательностей используется специальный плейсхолдер для формул — это помогает избежать проблем с отображением символов.

Пример литерала с новой строкой: \n\backslash n

Доступ к символам: индексация и длина

Индексация позволяет получить отдельный символ строки по его позиции. Обычно индексация начинается с нуля: первый символ имеет индекс ноль. Также распространено обращение с отрицательными индексами, где s[1]s[-1] обозначает последний символ, s[0]s[0] — первый и т.д.

Длина строки — это количество символов в ней. Обозначение длины может быть записано разными способами; в тексте мы будем использовать плейсхолдер для выражения длины строки, например s|s|.

Если s — строка, то проверка «пуста ли строка» эквивалентна проверке s=0|s| = 0.

Операции объединения и повторения

Конкатенация — операция соединения двух строк в одну. В языках программирования это часто выполняется оператором сложения строк. Запись с оператором соединения представлена как s+ts + t. Конкатенация сохраняет порядок символов: сначала идут символы первой строки, затем второй.

Повторение строки позволяет получить новую строку, состоящую из повторов исходной строки несколько раз. Такое действие часто обозначают оператором умножения строки на целое число; пример повторения строки три раза представлен как s3s * 3.

Пример: объединение имени и фамилии с пробелом — s+  +ts + ''\ \ '' + t.

Срезы и извлечение подстрок

Срез (substring, slice) позволяет выделить часть строки, задав начальный и конечный индекс. Формат среза обычно включает начальный индекс, двоеточие и конечный индекс, например s[1:4]s[1:4]. При этом часть строки включает символы от начального индекса включительно до конечного индекса невключительно.

Кроме того, срезы могут задаваться с шагом — это позволяет брать каждый k‑й символ в интервале. Пример с шагом приведен как s[0:10:2]s[0:10:2]. Такие операции удобны для обхода, формирования подстрок и выборки символов по определенному правилу.

Практический пример: если s — строка, то подстрока от второго до пятого символа записывается как s[1:4]s[1:4].

Поиск, замена и проверка вхождений

Для поиска подстроки в строке используются функции и методы, которые возвращают индекс первого вхождения или логическое значение о наличии подстроки. Операции поиска часто описываются специальными функциями; например, функция поиска может быть записана как find(s,a)\mathrm{find}(s,''a''), а проверка вхождения символа — как логическое выражение вида as''a'' \in s.

Замена — операция, создающая новую строку, в которой все или некоторые вхождения одной подстроки заменены другой. Общий вид такой операции можно записать как replace(s,a,b)\mathrm{replace}(s,''a'',''b''). Замена полезна при очистке текста, нормализации данных и подготовке к дальнейшей обработке.

Пример: заменить все вхождения символа ''a'' на ''b'' — replace(s,a,b)\mathrm{replace}(s,''a'',''b'').

Регистры, обрезка и разбивка

Положение регистра (верхний/нижний) важно при сравнении строк и при приведении текста к единому виду. Функции преобразования регистра часто обозначают как «to upper» и «to lower»; в нашем описании используем плейсхолдеры upper(s)\mathrm{upper}(s) и lower(s)\mathrm{lower}(s) соответственно.

Обрезка пробельных символов в начале и конце строки — частая операция предобработки текстов. Ее можно представить как функцию тримминга strip(s)\mathrm{strip}(s). Для разбиения строки на части по разделителю служит операция split, которую можно записать как split(s,,)\mathrm{split}(s, '',''). Обратная операция — объединение списка строк в одну — обычно называется join: join(,,L)\mathrm{join}('','', L).

Использование: сначала разбиваем строку по запятой — split(s,,)\mathrm{split}(s, '',''), затем собираем элементы обратно через точку с запятой — join(,,L)\mathrm{join}('','', L).

Сравнение строк и лексикографический порядок

Строки можно сравнивать между собой по лексикографическому (словному) порядку, аналогично словарной сортировке. Операторы равенства и неравенства позволяют проверить, совпадают ли строки (s==ts == t). Для упорядочивания строк могут применяться операторы меньше/больше, например s<ts < t.

При сравнении важно учитывать регистр и локаль: в некоторых языках и контекстах «А» и «а» считаются разными символами, а в некоторых операциях применяется нечувствительное к регистру сравнение. Частая практика — привести обе строки к одному регистру перед сравнением с помощью upper(s)\mathrm{upper}(s) или lower(s)\mathrm{lower}(s).

Форматирование и объединение данных

Форматирование строк позволяет встроить значения переменных в текст в удобном для чтения виде. Существуют разные подходы: конкатенация нескольких частей, использование специальных функций форматирования и f‑строк в современных языках. Обобщенная запись форматирования может быть представлена как format(Hello,  name)\mathrm{format}(''Hello {}'',\;name).

Форматирование удобно применять при выводе данных, подготовке сообщений об ошибках и формировании человекочитаемого представления сложных структур. Оно также важно при создании CSV‑строк, логов и отчетов, где формат должен быть строгим.

Пример форматирования имени и возраста через формат — format(Hello,  name)\mathrm{format}(''Hello {}'',\;name).

Практические рекомендации и распространенные ошибки

Всегда имейте в виду неизменяемость строк в большинстве языков: операции обычно возвращают новую строку, не меняя исходную. Например, методы преобразования регистра или замены возвращают новую строку, а не модифицируют существующую переменную.

Не забывайте про корректную обработку индексов при работе со срезами и индексами — использование отрицательных индексов даёт удобный доступ с конца (см. s[1]s[-1]), но при выходе за границы возникает ошибка или пустая подстрока в зависимости от языка. При конкатенации и форматировании следите за типами данных — нечисловые значения часто нужно предварительно преобразовать в строку.

Задания для самопроверки

1) Данa строка s. Получите её первый и последний символы, используя операции индексации (s[0]s[0] и s[1]s[-1]).

2) Объедините два слова s и t с пробелом между ними, используя операцию конкатенации (s+ts + t) или её эквивалент s+  +ts + ''\ \ '' + t.

3) Получите подстроку из s с третьего по седьмой символ, применяя срез s[1:4]s[1:4]. Как изменится запись, если нужен каждый второй символ в этом диапазоне (s[0:10:2]s[0:10:2])?

Контрольный пример: проверить, пуста ли строка s, проверка эквивалентна выражению s=0|s| = 0.