1. Поиск подстроки в строке
В прошлой лекции вы научились получать подстроку из строки. А в этой мы научимся находить одну строку в другой. Для этого есть 5 шикарных методов:
Метод Contains: содержит ли строка подстроку?
Возвращает true, если переданная строка содержится в той, у которой вызвали метод.
string phrase = "Ветер перемен";
bool hasWord = phrase.Contains("перемен"); // true
Поиск чувствителен к регистру! "ветер".Contains("В") — false.
Метод IndexOf: найти позицию подстроки
Очень похоже на работу IndexOf в массивах: ищет подстроку в строке (от начала к концу) и возвращает индекс первого вхождения подстроки.
string text = "арбузарбуз";
int index = text.IndexOf("буз"); // 2
- Если ничего не найдено, возвращает -1.
- Есть альтернатива с начальной позицией: IndexOf("буз", 4). Всё как в массивах.
Метод LastIndexOf: последнее вхождение
Также похоже на работу LastIndexOf в массивах: ищет подстроку в строке (от конца к началу) и возвращает индекс первого вхождения подстроки с конца.
string repeated = "задача задача";
int last = repeated.LastIndexOf("задача"); // 7
Начинается/заканчивается строка с заданной подстроки
Также часто нужно проверить, что наша строка начинается (или заканчивается) определённой подстрокой. Для этого есть два метода:
- StartsWith — проверяет, что строка начинается с определённой подстроки;
- EndsWith — проверяет, что строка заканчивается на заданную подстроку.
string fileName = "photo.jpg";
bool isJpg = fileName.EndsWith(".jpg"); // true
string email = "support@company.com";
bool isSupport = email.StartsWith("support"); // true
Если хочется сравнить без учёта регистра, то нужно передать дополнительный параметр с указанием режима сравнения (см. документацию для StringComparison.OrdinalIgnoreCase).
2. Метод Replace: замена символов и подстрок
Метод Replace заменяет все вхождения строки А на строку Б. Появился как инструмент для борьбы с опечатками, цензурой и заменой переменных в шаблонах! (Шутка.)
string address = "Лондон, улица Бейкер-стрит";
string updated = address.Replace("Лондон", "Париж");
Console.WriteLine(updated); // "Париж, улица Бейкер-стрит"
- Можно заменить даже отдельные символы: str.Replace('а', 'я')
- Важно: все замены происходят во всей строке, а не только в первом вхождении.
3. Метод Split: разрезаем строку на кусочки
Метод Split делает следующее: берёт вашу строку и режет её на части, используя разделители — символы или строки, по которым нужно разбивать. Метод возвращает массив строк, на которые он порезал исходную строку.
string[] parts = originalString.Split(separator);
- separator — символ или массив символов, которые будут использоваться в качестве разделителя.
Самый простой пример
Разделим строку по пробелу:
string input = "яблоко груша апельсин банан";
string[] fruits = input.Split(' '); // содержит массив ["яблоко","груша","апельсин","банан"]
Console.WriteLine(fruits[0]); // "яблоко"
Console.WriteLine(fruits[1]); // "груша"
Здесь мы получили массив строк длиной 4, где каждое слово — отдельный элемент массива.
Несколько разделителей
Иногда в строке может быть не только один вид разделителя. Например, пользователь мог ввести значения через пробел, запятую или точку с запятой.
В таких случаях можно использовать массив символов-разделителей:
string input = "яблоко, груша; апельсин банан";
char[] separators = { ' ', ',', ';' };
string[] fruits = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);
Бонус: опциональный параметр StringSplitOptions.RemoveEmptyEntries убирает пустые фрагменты. Это нужно, если пользователь ввёл несколько разделителей подряд — например, два пробела или что-то вроде "яблоко,, груша".
Разделение по подстроке
Разделители могут быть и строками, а не только символами. Например, если у вас CSV-файл с разделителем ";" или |:
// Разделитель по одному символу
string data = "Иванов;Петров;Сидоров";
string[] names = data.Split(';'); // по символу ';'
// Или, если разделитель - целая строка:
string log = "2024-01-01::Ошибка::Не удалось выполнить задачу";
string[] separators = { "::" };
string[] parts = log.Split(separators);
4. Метод Join: собираем массив строк обратно
Метод Join делает обратную работу: принимает массив строк и склеивает их в одну строку, вставляя между элементами выбранный вами разделитель.
string result = string.Join(separator, arrayOfStrings);
- separator — строка, которая будет вставляться между элементами.
- arrayOfStrings — массив или коллекция строк (string[], List<string> и др.).
Простейший пример
Создадим из массива строк одну строку с запятыми:
string[] items = { "яблоко", "груша", "апельсин", "банан" };
string joined = string.Join(", ", items);
Console.WriteLine(joined); // "яблоко, груша, апельсин, банан"
Объединение с пустым разделителем — сливаем строки в одну
Иногда хочется просто собрать строки подряд, не вставляя ничего между ними:
string[] parts = { "Я", "люблю", "C#" };
string message = string.Join("", parts);
Console.WriteLine(message); // "ЯлюблюC#"
5. Типичные ошибки
Очень часто начинающие разработчики сталкиваются с тем, что забывают убрать лишние пробелы после разделения строки методом Split. Например, если у пользователя рука дрогнула, и он написал "яблоко, груша ,банан", то после Split получатся элементы вроде " груша ". Если сразу конвертировать в числа или использовать сравнение, будет баг. Используйте Trim() после Split для каждого элемента — это хорошая привычка.
Второй момент — лишние пустые строки. Когда пользователь ввёл два разделителя подряд или начал и закончил строку разделителем, Split может вернуть пустые элементы. Включайте StringSplitOptions.RemoveEmptyEntries, чтобы не ловить потом ошибки.
Если массив для Join содержит пустые элементы или null, то Join их просто проигнорирует. Но если вы этого не хотите (например, для отчёта важно показать, что некоторые значения были пропущены), придётся сначала обработать массив вручную.
И ещё: Split никогда не изменяет исходную строку, а возвращает новый массив. Join также не изменяет исходный массив, а выдаёт новую строку. Помните: строки и массивы в C# — иммутабельны (неизменяемы).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ