Строки в C#: как написать программу без регулярных выражений

Регулярные выражения — боль, с которой приходится жить каждому разработчику. К счастью, C# даёт возможность их почти не использовать.

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

Исключение — язык C#, огромные возможности которого позволяют почти всегда спокойно без них обойтись.

Содержание статьи:

1. Как работать со строками в C#:

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

1.2 Экранирование кавычек и специальных символов

1.3 Как и зачем работать с пустыми строками

1.4 Поиск значений в строке

1.5 Изменение — замена символов и строк, смена регистра

1.6 Форматирование

2. Оптимизация нагрузки с помощью класса StringBuilder

3. Заключение

Евгений Кучерявый

Пишет о разработке сайтов, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.


Как работать со строками в C#

Нужный функционал представляет класс string. С его помощью можно создавать строки и проводить различные операции.

//Создание обычной строки
//Текст должен находиться в двойных кавычках
string text = "Live long";
string text1 = new String("Text");
string text2 = new String('O', 5); //Создание строки, в которой будет 5 букв O: OOOOO
string text3 = new String(new char[] {'W','o','r','d'}); //Создание строки из массива
//Одинарные кавычки используются для символов
//char symbol = 'a';

Вот что получится, если вывести все эти значения. Чтобы сократить количество кода в статье, здесь и далее не используются операторы вывода:

Как складывать строки в C#

Строки можно складывать друг с другом — этот процесс называется конкатенацией.

string textConcat = text + " and prosper!"; //Можно использовать оператор сложения
string textConcat = text.Concat(" and prosper!"); //Также можно использовать метод Concat()
//К строке можно добавлять данные других типов
int num = 5;
string numConcat = "Num: " + num;
bool boolVal = true;
string boolConcat = "Bool: " + boolVal;
//Чтобы присвоить переменной строкового типа данные другого типа, их нужно преобразовать в строку
//Для этого используйте метод ToString()
string toString = num.ToString();
//Вместо оператора сложения можно использовать интерполяцию
//Для этого поставьте символ $ перед открывающей кавычкой и укажите переменные внутри фигурных скобок
string dollarSymbol = $"Num: {num}";
Console.WriteLine("Length: {0}", textConcat.Length); //Длина строки

Вот что можно увидеть, если вывести это всё:

Экранирование кавычек и специальных символов в C#

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

Чтобы использовать такие символы, их нужно экранировать — для этого ставьте перед ними знак обратного слэша.

string singleQuote = "My name is Fred O'Connell."; //Одинарные кавычки можно использовать
string doubleQuote = "He said: \"Hello!\""; //Экранированные двойные кавычки
//Также слэши используются для вставки специальных символов. Например, переноса строки(\n) или табуляции (\t)
string newLine = "Hello\nnew line!";
//Чтобы использовать обратный слэш в тексте, его тоже нужно экранировать
string slash = "C:\\Windows\\";
//Если перед строкой поставить символ @, то компилятор автоматически экранирует все специальные символы
string withoutSlash = @"C:\Windows\";

Вот что получится, если вывести эти переменные:

Пустые строки в C#

Иногда нужно использовать пустую строку или проверить, есть ли текст в переменной.

//Создание пустой переменной строкового типа
string noValue;
string emptyString = string.Empty;
string nullString = null;
string quoteString = "";
//Метод IsNullOrEmpty() позволяет проверить, есть ли что-нибудь в строке
if(string.IsNullOrEmpty(emptyString))
{
     emptyString = "The string is null or empty!";
}

Вот что будет выведено:

Поиск в C#

В C# можно найти позицию определенной подстроки или символа в тексте, проверить, с чего он начинается и чем кончается.

//Можно проверить, с чего начинается или чем кончается строка
string someText = "Some text";
if(someText.StartsWith("Some") && someText.EndsWith("text"))
{
    Console.WriteLine(true);
}

//Поиск положения определенного символа
string indexText = "Hello, World! Hello, Sunshine!";

Console.WriteLine(indexText.IndexOf(',')); //Поиск первого совпадения
Console.WriteLine(indexText.LastIndexOf(',')); //Поиск последнего совпадения

Console.WriteLine(indexText.IndexOf("Sunshine")); //Можно искать индексы целых подстрок
Console.WriteLine(indexText.IndexOf(',', 7)); //Можно указать начало поиска
Console.WriteLine(indexText.IndexOf(',', 6, 5)); //Также можно указать количество символов, которые будут проверены
//Если искомое значение не будет найдено, будет возвращено значение –1

string[] sArray = indexText.Split(','); //Создание массива подстрок из строки. В качестве аргумента принимается разделитель
foreach(string s in sArray)
{
    Console.WriteLine(s);
}

Вот что будет выведено в результате работы такого кода:

Изменение строк в C#

Строки можно редактировать — добавлять или удалять слова и символы, менять регистры, а также заменять одну подстроку другой:

//Символы можно перевести в верхний или нижний регистр
string lower = emptyString.ToLower();
string upper = emptyString.ToUpper();

//Строку можно обрезать
string sub1 = emptyString.Substring(5); //Начиная с 5 символа
string sub2 = emptyString.Substring(1, 5); //5 символов, начиная с нулевого

//Замена значения в тексте
string errorText = "This si text. It si very short.";
errorText = errorText.Replace("si", "is"); //Замена всех si на is

//Преобразование строки в массив символов
char[] chars = text.ToCharArray();

char char1 = text[2];

text = text.Trim(); //Удаление пробелов из начала и конца строки

Вот каким будет вывод этих значений:

Форматирование строк в C#

В C# есть возможность выбрать формат отображения строки:

long number = 88005000522; //Номер Skillbox — звонок бесплатный
Console.WriteLine(number.ToString("# (###) ###-##-##"));

Вот что выведет такой код:

Схожие возможности предоставляет метод Format(), которые позволяет вывести значение в соответствии с одним из доступных форматов:

  • C / c — денежная единица (вывод зависит от единицы, указанной в настройках системы пользователя);
  • D / d — целое число с минимальной длиной (если переданное число короче, в начале будут добавлены нули);
  • E / e — экспоненциальное представление числа;
  • F / f — дробное число с фиксированной точкой;
  • G / g — выбор более короткого формата: E или F;
  • N / n — другой вариант дробного числа с фиксированной точкой;
  • P / p — отображение процентов;
  • X / x — отображение числа в шестнадцатеричной системе счисления.

Вот пример кода с их использованием:

int id = 5;
double sum = 100.0;

Console.WriteLine(string.Format("{0:d5}", id));
Console.WriteLine(sum.ToString("c2"));

Вот что будет выведено:

Работа со строками с помощью StringBuilder

Хотя класс string и предоставляет огромный функционал, у него есть серьезный недостаток — переменные с текстом не редактируются, а удаляются и создаются с новым значением. Чем больше нужно провести операций со строкой, тем больше ресурсов потребляет приложение.

Поэтому, если необходимо неоднократно изменять строку, лучше использовать класс StringBuilder. Он предоставляет меньше возможностей, но позволяет значительно сэкономить ресурсы.

Чтобы работать с ним, подключите библиотеку System.Text:

//Объявление экземпляра класса StringBuilder
StringBuilder builder = new StringBuilder("Hello, ");
//В качестве аргумента можно указать максимальный объем занимаемой памяти

builder.Append("World!"); //Конкатенация строки
//Также существует метод AppendFormat(), который добавляет в конец строки форматированный текст
builder.Replace('.', ','); //Замена точек на запятые

builder.Insert(5, "awe2"); //Вставка подстроки после пятой позиции

builder.Remove(5, 4); //Удаление 4 символов, начиная с пятой позиции

//Вывод строки, ее длины и занимаемой памяти
Console.WriteLine($"Text: {builder}\nLength: {builder.Length}\nCapacity: {builder.Capacity}");

Вот что выведет программа:

Заключение

C# сокращает количество задач, в которых пришлось бы использовать регулярные выражения, — для многих целей достаточно вызывать обычные методы.

Если вы хотите подробнее разобраться в работе со строками и регулярными выражениями, запишитесь на курс «C#-разработчик». Он состоит из теоретической части и домашних заданий, которые помогут практическим путем закрепить полученные знания.

Курс

C#-разработчик


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

Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox