Метанит строки си шарп

Метанит строки си шарп

Классы StringBuilder и String предоставляют достаточную функциональность для работы со строками. Однако .NET предлагает еще один мощный инструмент — регулярные выражения. Регулярные выражения представляют эффективный и гибкий метод по обработке больших текстов, позволяя в то же время существенно уменьшить объемы кода по сравнению с использованием стандартных операций со строками.

Основная функциональность регулярных выражений в .NET сосредоточена в пространстве имен System.Text.RegularExpressions . А центральным классом при работе с регулярными выражениями является класс Regex. Например, у нас есть некоторый текст и нам надо найти в нем все словоформы какого-нибудь слова. С классом Regex это сделать очень просто:

using System.Text.RegularExpressions; string s = «Бык тупогуб, тупогубенький бычок, у быка губа бела была тупа»; Regex regex = new Regex(@»туп(\w*)»); MatchCollection matches = regex.Matches(s); if (matches.Count > 0) < foreach (Match match in matches) Console.WriteLine(match.Value); >else

Здесь мы находим в искомой строке все словоформы слова «туп». В конструктор объекта Regex передается регулярное выражение для поиска. Далее мы разберем некоторые элементы синтаксиса регулярных выражений, а пока достаточно знать, что выражение туп(\w*) обозначает, найти все слова, которые имеют корень «туп» и после которого может стоять различное количество символов. Выражение \w означает алфавитно-цифровой символ, а звездочка после выражения указывает на неопределенное их количество — их может быть один, два, три или вообще не быть.

Метод Matches класса Regex принимает строку, к которой надо применить регулярные выражения, и возвращает коллекцию найденных совпадений.

Читайте также:  Заметки и напоминания

Каждый элемент такой коллекции представляет объект Match . Его свойство Value возвращает найденное совпадение.

И в данном случае мы получим следующий консольный вывод

тупогуб тупогубенький тупа

Параметр RegexOptions

Класс Regex имеет ряд конструкторов, позволяющих выполнить начальную инициализацию объекта. Две версии конструкторов в качестве одного из параметров принимают перечисление RegexOptions . Некоторые из значений, принимаемых данным перечислением:

  • Compiled : при установке этого значения регулярное выражение компилируется в сборку, что обеспечивает более быстрое выполнение
  • CultureInvariant : при установке этого значения будут игнорироваться региональные различия
  • IgnoreCase : при установке этого значения будет игнорироваться регистр
  • IgnorePatternWhitespace : удаляет из строки пробелы и разрешает комментарии, начинающиеся со знака #
  • Multiline : указывает, что текст надо рассматривать в многострочном режиме. При таком режиме символы «^» и «$» совпадают, соответственно, с началом и концом любой строки, а не с началом и концом всего текста
  • RightToLeft : приписывает читать строку справа налево
  • Singleline : при данном режиме символ «.» соответствует любому символу, в том числе последовательности «\n», которая осуществляет переход на следующую строку
Regex regex = new Regex(@"туп(\w*)", RegexOptions.IgnoreCase);

При необходимости можно установить несколько параметров:

Regex regex = new Regex(@"туп(\w*)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

Синтаксис регулярных выражений

Рассмотрим вкратце некоторые элементы синтаксиса регулярных выражений:

  • ^ : соответствие должно начинаться в начале строки (например, выражение @»^пр\w*» соответствует слову «привет» в строке «привет мир»)
  • $ : конец строки (например, выражение @»\w*ир$» соответствует слову «мир» в строке «привет мир», так как часть «ир» находится в самом конце)
  • . : знак точки определяет любой одиночный символ (например, выражение «м.р» соответствует слову «мир» или «мор»)
  • * : предыдущий символ повторяется 0 и более раз
  • + : предыдущий символ повторяется 1 и более раз
  • ? : предыдущий символ повторяется 0 или 1 раз
  • \s : соответствует любому пробельному символу
  • \S : соответствует любому символу, не являющемуся пробелом
  • \w : соответствует любому алфавитно-цифровому символу
  • \W : соответствует любому не алфавитно-цифровому символу
  • \d : соответствует любой десятичной цифре
  • \D : соответствует любому символу, не являющемуся десятичной цифрой

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

Теперь посмотрим на некоторые примеры использования. Возьмем первый пример с скороговоркой «Бык тупогуб, тупогубенький бычок, у быка губа бела была тупа» и найдем в ней все слова, где встречается корень «губ»:

string s = "Бык тупогуб, тупогубенький бычок, у быка губа бела была тупа"; Regex regex = new Regex(@"\w*губ\w*");

Так как выражение \w* соответствует любой последовательности алфавитно-цифровых символов любой длины, то данное выражение найдет все слова, содержащие корень «губ».

Второй простенький пример — нахождение телефонного номера в формате 111-111-1111:

string s = "456-435-2318"; Regex regex = new Regex(@"\d-\d-\d");

Если мы точно знаем, сколько определенных символов должно быть, то мы можем явным образом указать их количество в фигурных скобках: \d — то есть в данном случае три цифры.

Мы можем не только задать поиск по определенным типам символов — пробелы, цифры, но и задать конкретные символы, которые должны входить в регулярное выражение. Например, перепишем пример с номером телефона и явно укажем, какие символы там должны быть:

string s = "456-435-2318"; Regex regex = new Regex("1-4-6");

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

Также можно задать диапазон для алфавитных символов: Regex regex = new Regex(«[a-v]»); — данное выражение будет соответствовать любому сочетанию пяти символов, в котором все символы находятся в диапазоне от a до v.

Можно также указать отдельные значения: Regex regex = new Regex(@»[2]*-7-\d»); . Это выражение будет соответствовать, например, такому номеру телефона «222-222-2222» (так как первые числа двойки)

С помощью операции | можно задать альтернативные символы, например:

Regex regex = new Regex(@"(2|3)-5-\d");

То есть первые три цифры могут содержать только двойки или тройки. Такой шаблон будет соответствовать, например, строкам «222-222-2222» и «323-435-2318». А вот строка «235-435-2318» уже не подпадает под шаблон, так как одной из трех первых цифр является цифра 5.

Итак, у нас такие символы, как *, + и ряд других используются в качестве специальных символов. И возникает вопрос, а что делать, если нам надо найти, строки, где содержится точка, звездочка или какой-то другой специальный символ? В этом случае нам надо просто экранировать эти символы слешем:

Regex regex = new Regex(@"(2|3)\.4\.\d"); // этому выражению будет соответствовать строка "222.222.2222"

Проверка на соответствие строки формату

Нередко возникает задача проверить корректность данных, введенных пользователем. Это может быть проверка электронного адреса, номера телефона, Класс Regex предоставляет статический метод IsMatch , который позволяет проверить входную строку с шаблоном на соответствие:

using System.Text.RegularExpressions; string pattern = @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\\|~\w])*)(?<=[0-9a-z])@))" + @"(?(\[)(\[(\d\.)\d\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]))$"; var data = new string[] < "tom@gmail.com", "+12345678999", "bob@yahoo.com", "+13435465566", "sam@yandex.ru", "+43743989393" >; Console.WriteLine("Email List"); for(int i = 0; i < data.Length; i++) < if (Regex.IsMatch(data[i], pattern, RegexOptions.IgnoreCase)) < Console.WriteLine(data[i]); >>

Переменная pattern задает регулярное выражение для проверки адреса электронной почты. Данное выражение предлагает нам Microsoft на страницах msdn.

Далее в цикле мы проходим по массиву строк и определяем, какие строки соответствуют этому шаблону, то есть представляют валидный адрес электронной почты. Для проверки соответствия строки шаблону используется метод IsMatch: Regex.IsMatch(data[i], pattern, RegexOptions.IgnoreCase) . Последний параметр указывает, что регистр можно игнорировать. И если строка соответствует шаблону, то метод возвращает true .

Замена и метод Replace

Класс Regex имеет метод Replace, который позволяет заменить строку, соответствующую регулярному выражению, другой строкой:

string text = "Мама мыла раму. "; string pattern = @"\s+"; string target = " "; Regex regex = new Regex(pattern); string result = regex.Replace(text, target); Console.WriteLine(result);

Данная версия метода Replace принимает два параметра: строку с текстом, где надо выполнить замену, и сама строка замены. Так как в качестве шаблона выбрано выражение «\s+ (то есть наличие одного и более пробелов), метод Replace проходит по всему тексту и заменяет несколько подряд идущих пробелов ординарными.

Другой пример — на вход подается номер телефона в произвольном формате, и мы хотим оставить в нем только цифры:

string phoneNumber = "+1(876)-234-12-98"; string pattern = @"\D"; string target = ""; Regex regex = new Regex(pattern); string result = regex.Replace(phoneNumber, target); Console.WriteLine(result); // 18762341298

В данном случае шаблон «\D» представляет любой символ, который не является цифрой. Любой такой символ заменяется на пустую строку «», то есть в итоге из строки «+1(876)-234-12-98» мы получим строку «18762341298».

Источник

Работа со строками

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

В языке C# строковые значения представляет тип string , а вся функциональность работы с данным типом сосредоточена в классе System.String . Собственно string является псевдонимом для класса String. Объекты этого класса представляют текст как последовательность символов Unicode. Максимальный размер объекта String может составлять в памяти 2 ГБ, или около 1 миллиарда символов.

Создание строк

Создавать строки можно, как используя переменную типа string и присваивая ей значение, так и применяя один из конструкторов класса String:

string s1 = "hello"; string s2 = new String('a', 6); // результатом будет строка "aaaaaa" string s3 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >); string s4 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >, 1, 3); // orl Console.WriteLine(s1); // hello Console.WriteLine(s2); // aaaaaaa Console.WriteLine(s3); // world Console.WriteLine(s4); // orl

Конструктор String имеет различное число версий. Так, вызов конструктора

6 раз повторит объект из первого параметра, то есть фактически создаст строку «aaaaaa».

Еще один конструктор принимает массив символов, из которых создается строка

string s3 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >);

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

string s4 = new String(new char[] < 'w', 'o', 'r', 'l', 'd' >, 1, 3); // orl

Строка как набор символов

Так как строка хранит коллекцию символов, в ней определен индексатор для доступа к этим символам:

public char this[int index]

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

string message = "hello"; // получаем символ char firstChar = message[1]; // символ 'e' Console.WriteLine(firstChar); //e Console.WriteLine(message.Length); // длина строки

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

Перебор строк

Класс String реализует интерфейс IEnumerable, благодаря чему строку можно перебрать в цикле foreach как набор объектов char. Также можно с помощью других типов циклов перебрать строку, применяя обращение к символам по индексу:

string message = «hello»; for(var i =0; i < message.Length; i++) < Console.WriteLine(message[i]); >foreach(var ch in message)

Сравнение строк

В отличие от других классов строки сравниваются по значению их символов, а не по ссылкам:

string message1 = "hello"; string message2 = "hello"; Console.WriteLine(message1 == message2); // true

Многострочные строки

Начиная с C# 11 с помощью трех пар двойных кавычек можно оформить многострочный текст, в том числе с применением интерполяции:

Print(); PrintValue(«hello»); void Print() «»»; Console.WriteLine(text); > void PrintValue(string val) < string text = $""" """; //// или так //string text = $$""" // // // > //

Источник

Оцените статью