C#: Регулярные выражения — в примерах и теории

Сегодня мы поговорим о достаточно немаловажном элементе практически любого языка программирования — о регулярных выражениях. И постараемся рассмотреть мы их в режиме «для начинающих программистов«.


Немного теории. Регулярное выражение, по сути, является шаблоном, задающим формат текста. Как известно текст состоит из символов некоторого языка, а язык по сути состоит из букв алфавита. Регулярное выражение описывает шаблон текста, указывая как буквы алфавита будут в нем располагаться. Если говорить о языках программирования, то регулярное выражение задает шаблон подстроки, которую нужно найти в тексте.
Регулярный язык включает в себя набор операторов, ознакомится с ним (для языка С#) можно тут или в Google по ссылкам ниже:

Например:
* - оператор итерации, т.е. символ или набор символов может повторяться от 0 до бесконечности раз.
i* = String.Empty
i* = iiii
i* = iiiii...iii
(ide)* = ideideideide
+ - оператор положительной итерации, т.е. символ или набор символов может повторяться от 1 до бесконечности раз.
i+ != String.Empty
i+ = iiii
i+ = iiiii...iii
(ide)+ = ideideideide

Теперь перейдем непосредсвтенно к применению выражений на практике. Начнем с простого. Допустим у нас есть текст, в к котором указан курс доллара.

бла бла бла… Сегодня курс доллара составляет 30.11$.

Текст может быть разный, но мы знаем что всегда имеется конструкция вида [число с плавующей точкой][символ ‘$’][символ ‘.’].

string text = "бла бла бла... Сегодня курс доллара составляет 30.11$.";
Regex regex = new Regex(@"\s\d+\.\d+\$\.");
Match match = regex.Match(text);
while (match.Success)
{
 MessageBox.Show(match.Index.ToString() + " " +
                 match.Value);
 match = match.NextMatch();
}

Данный код сообщит нам позицию вхождения данной подстроки, а так же саму подстроку «30.11$.».
Давайте разберем конструкцию «\s\d+\.\d+\$\.». Здесь мы имеем следующее: «мы ищем подстроку которая начинается с пробела (\s) далее идет некоторое положительное количество цифр (\d+) далее символ точка (\.), далее опять некоторое положительное число цифр, далее символ доллар (\$) и символ точка».

Важно: Так как в регулярном языке C# имеются технические символы ‘$’, ‘.’, то для указания их как символов необходимо указывать слеш перед ними. Для не служебных символов, указывать слеш не нужно, например если бы разделитель была бы не точка а ‘:’, то числа бы разделялись ‘\d+:\d+’!

Наше регулярное выражение немного не корректно, ибо курс доллара может быть целым числом без дробной части, а следовательно наше выражение не сработает. Давайте подредактируем его для правильной работы.
Добавим оператор «?» — отвечающий, за то, что указанный символ или набор символов могут и не быть на данном месте. В нашем случае имеем набор символов.

string text = "бла бла бла... Сегодня курс доллара составляет 30.11$.";
Regex regex = new Regex(@"\s\d+(\.\d+)?\$\.");
Match match = regex.Match(text);
while (match.Success)
{
 MessageBox.Show(match.Index.ToString() + " " +
                 match.Value);
 match = match.NextMatch();
}

Теперь все будет работать как надо.

Разберем второй пример. Пусть есть шаблонная строка:
Привет, «Иванов Иван», как у тебя дела? Я правильно понял что тебе «25» лет?

Допустим нам нужно вытащить данные о возрасте человека и его фамилию и имя. Имеем:


string text = "Привет, \"Иванов Иван\", как у тебя дела?" +
              "Я правильно понял что тебе \"25\" лет?";
Regex regex = new Regex("\"[0-9\\sА-яЁё]*\"");
Match match = regex.Match(text);
while (match.Success)
{
 MessageBox.Show(match.Index.ToString() + " " +
                 match.Value);
 match = match.NextMatch();
}

Здесь мы указываем, что мы ищем подстроки в кавычках. Причем в кавычках могут идти цифры от 0 до 9, пробел, либо текст русского алфавита.

Важно: символ ‘ё’ не попадает в диапазон «АБВ…Яаб…я», поэтому его нужно указывать отдельно!

Ну вот собственно и все. Всем спасибо =)

Запись опубликована в рубрике C# с метками , , , . Добавьте в закладки постоянную ссылку.