Операции со строками String в C#: пишем программу без регулярных выражений
В разработке приложений и сервисов большой объем задач связан с обработкой строк: поиск , парсинг веб-страниц, извлечение информации из текста. Язык C# позволяет решать такие задачи без за счет встроенныхи методов. Рассказываем, почему это важно и как использовать возможности C# при работе со строковыми.
Писать и хранить код удобно на российской платформе GitVerse, которая одновременно выполняет функции хранилища репозиториев, площадки для командной разработки и точки входа в активное комьюнити. К созданию приложений на C# можно привлечь других пользователей GitVerse и AI-помощника GigaCode. Виртуальный ассистент умеет анализировать контекст и предлагать функции, , циклы и условия для оптимальной реализации кода.
Регулярные выражения в C#
RegEx, или RegExp (regular expressions / регулярные выражения), — это инструментарий для обработки строк. Его основное назначение — находить последовательности символов в больших строковых значениях, извлекать информацию из неструктурированного текста и совершать операции с его фрагментами. Например:
- идентифицировать повторяющиеся слова;
- сделать начальные буквы всех слов заглавными;
- выделить определенные фрагменты в URL.
Одна из особенностей RegEx — универсальность. Зная логику и синтаксис, можно использовать их в разных языках программирования, в том числе C#. Применение RegEx позволяет сократить код и оптимизировать решение задач, связанных с обработкой подстрок.
Однако регулярные выражения подходят не для всех типов текстов, иногда они ухудшают качество кода и конечного продукта. Попытки внедрения RegEx в проект могут существенно замедлить процесс разработки, увеличивая время на программирование и багфиксинг.
Почему частое использование регулярных выражений — плохая практика
В некоторых ситуациях применение RegEx неоправданно или неэффективно. К его недостаткам можно отнести:
- ухудшение читаемости кода;
- сложность поддержки проекта, особенно для новых разработчиков или специалистов без опыта работы с RegEx;
- снижение производительности приложения;
- возможные проблемы с утечкой памяти.
Это не означает, что регулярных выражений следует избегать. Они могут быть незаменимым инструментом для реализации сложных сценариев обработки текста. Однако при разработке на C# во многих случаях более рациональным решением является использование встроенных методов и операторов.
Операции над строками в C#
В C# объекты класса String представляют текст как последовательность символов Unicode. По умолчанию их максимальный размер составляет 2 Гб, а число символов — около 1 млрд.
Класс предоставляет ряд методов для выполнения операций со строковыми значениями. К основным можно отнести:
- Compare — сравнение двух указанных объектов;
- Contains — определение содержания подстроки;
- Concat — сложение строковых значений (конкатенация);
- CopyTo — копирование всего содержимого или определенного числа символов в диапазон назначения;
- IndexOf — поиск индекса с отсчетом от нуля первого вхождения указанного символа;
- LastIndexOf — поиск индекса последнего вхождения;
- Split — разделение строкового значения на массив;
- ToLower — перевод всех символов в нижний регистр;
- ToUpper — перевод всех символов в верхний регистр;
- Trim — удаление пробелов в начале и конце строкового значения;
- Equals — определение эквивалентности значений указанных объектов или экземпляров;
- Format — форматирование;
- Substring — извлечение последовательности символов из заданного экземпляра;
- Insert — вставка последовательности символов в строковое значение;
- Replace — замена символа или последовательности символов.
Разберем выполнение основных операций.
Примеры операций со строками в C#
Создание строки в C#
Создавать строковые значения можно через тип данных string или с помощью конструкторов.
Пример кода, использующий строковую переменную text и присваивающий ей значение "Hello Gitverse!":
string text = "Hello Gitverse!";
Выполним операцию создания во фрагменте кода следующего типа:
регистр
Другой вариант создания строкового значения — использование конструктора String. Например, чтобы создать текст, состоящий из пяти символов «A», используем такой синтаксис:
string text1 = new String('A', 5);Этот код создает переменную строкового типа text1 из пяти символов «A».
<no> alt=«Код C#» </no>
Результат выполнения кода:
<no> alt=«Строка в C#» </no>
Конструктор можно использовать для создания массива символов: string text2 = new String(new char[] { 'g', 'i', 't', 'v', 'e', 'r', 's', 'e' });
Запускаем код:
Результат выполнения:
С помощью конструктора можно создать строковое значение из части массива. Для этого нужно задать массив, индекс первого символа и длину , которую требуется извлечь.
Пример:string text3 = new String(new char[] { 'g', 'i', 't', 'v', 'e', 'r', 's', 'e' }, 2, 5);
Второй параметр передает начальный индекс, с которого извлекаются символы, а третий параметр указывает на число символов.
Из массива g, i, t, v, e, r, s, e будет извлечено пять символов начиная с индекса 2 (с символа t).
подстроки
Результат:
Конкатенация в C#
В C# можно объединять последовательности символов в одно строковое значение с помощью оператора сложения или метода Concat.
Зададим str1 = "Hello", str2 = "Gitverse!" и сложим их, используя следующий синтаксис: string result = str1 + " " + str2;
Код соединяет значения str1 и str2, результатом должен стать текст «Hello Gitverse!». Проверяем:
Результат выполнения кода:

Теперь используем метод Concat. Зададим str1 = "Hello" и str2 = "Gitverse!" и выполним код со следующим синтаксисом:
string result = string.Concat(str1, " ", str2);
Метод сцепляет строковые представления двух указанных объектов: str1 и str2.
Результат:
Использование сложения и метода Concat оправдано для конкатенации небольшого строковых значений. Эти операции не редактируют строковые объекты, а создают новые, что ведет к появлению множества временных элементов и повышенному потреблению ресурсов приложением.
Для складывания больших объемов строковых данных или при работе с циклами больше подходит класс StringBuilder.
с использованием StringBuilder: StringBuilder sb = new StringBuilder();
sb.Append("Hello"); sb.Append(" Gitverse!"); string result = sb.ToString();
Код создает экземпляр StringBuilder, добавляет к нему два строковых элемента и вызывает метод ToString() для выполнения операции сложения.
Результат конкатенации:
Разделение строки в С#
В C# можно сегментировать строковое значение на две или больше частей по разделителям. Для этого используется метод Split():
string text = "Hello Gitverse!"; string[] words = text.Split(' ');
В C# можно сегментировать строковое значение на две или больше частей по разделителям. Для этого используется метод Split():
string text = "Hello Gitverse!"; string[] words = text.Split(' ');
Результат:
Также можно указать несколько символов для разделения строкового элемента: string text = "Hello,Gitverse!";
string[] words = text.Split(new char[] { ',', '!' });
Результат:
C# сравнивает строковые по значению символов. Реализовать сравнение можно с помощью ==, <, <=, >, >=, методов Equals и Compare.
Оператор == сравнивает два строковых значения по содержимому.
Зададим str1 = "hello" и str2 = "Gitverse" и применим оператор:
if (str1 == str2) {
// Значения равны
} else {
}Код создает два элемента — str1 и str2 и затем сравнивает их оператором ==.
элементы
операторов
// Значения не равны
Теперь рассмотрим применение метода Equals.Зададим значения str1 = "hello" и str2 = "Gitverse". Выполним операцию с Equals:
if (str1.Equals(str2)) {
// Значения равны
} else {
}
// Значения не равны
Заменим переменные:
Также сравнивать можно с помощью Compare. Метод возвращает значение, указывающее, какая предшествует в порядке сортировки.
Задаем str1 = "hello" и str2 = "Gitverse". Применяем метод: int result = string.Compare(str1, str2);if (result == 0){
// Строки равны
}else if (result < 0) {
// str1 предшествует str2
} else {
}
// str1 следует за str2
Код сравнивает str1 и str2 с помощью метода Compare, который возвращает значение, указывающее на результат сравнения.
Замена символов в строке
Операция замены может понадобиться при форматировании текста, исправлении ошибок, обработке пользовательского ввода, корректировки и обновлении данных. Для этого удобно использовать метод Replace.
Replace находит в исходном тексте все вхождения заданного символа или комбинации символов, заменяет их другими заданными символами и возвращает новое строковое значение.
Пример использования метода:string originalString = "Hello, world!";string replacedString = originalString.Replace("world", "Gitverse");
Код создает originalString, затем меняет все слова «world» на «Gitverse» с помощью метода Replace.
Результат:
Вставка одной строки в другуюФункция Insert добавляет заданные символы в исходный текст перед символом с
указанным индексом.Сделаем из фразы «Сегодня понедельник» фразу «Сегодня не понедельник»:
string originalString = "Сегодня понедельник"; string insertedString = " не";string result = originalString.Insert(7, insertedString);
Запускаем код:
Результат исполнения кода:v
Метод Remove принимает индекс начиная с которого будут удалены все символы. Зададим текст text = "Люблю понедельники" и выполним :
int ind = text.Length - 1; text = text.Remove(ind); Console.WriteLine(text);
Этот код удаляет последнюю букву, оставляя фразу «Люблю понедельник». Дополнительно можно ввести параметр количества символов, которые нужно удалить:
text = text.Remove(0, 6);
Console.WriteLine(text);
Этот код удаляет первые шесть символов данной фразы, оставляя одно слово — «понедельник».
Экранирование
Некоторые символы в текстовых фрагментах могут затруднять компиляцию кода. Поэтому при добавлении в текст и спецсимволов определенных типов нужно использовать .
Например, обратный слэш в тексте необходимо экранировать с помощью следующей конструкции: str = "C:\\folder\\file.txt".
Для экранирования двойных кавычек используют обратный слэш: str = "Это \"кавычки\" в строке".