Сегодня мы поговорим о достаточно немаловажном элементе практически любого языка программирования — о регулярных выражениях. И постараемся рассмотреть мы их в режиме «для начинающих программистов«.
Немного теории. Регулярное выражение, по сути, является шаблоном, задающим формат текста. Как известно текст состоит из символов некоторого языка, а язык по сути состоит из букв алфавита. Регулярное выражение описывает шаблон текста, указывая как буквы алфавита будут в нем располагаться. Если говорить о языках программирования, то регулярное выражение задает шаблон подстроки, которую нужно найти в тексте.
Регулярный язык включает в себя набор операторов, ознакомится с ним (для языка С#) можно тут или в 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, пробел, либо текст русского алфавита.
Важно: символ ‘ё’ не попадает в диапазон «АБВ…Яаб…я», поэтому его нужно указывать отдельно!
Ну вот собственно и все. Всем спасибо =)