Regular expressions — это мощное, гибкое и эффективное средство обработки текста. Шаблон (pattern) регулярного выражения — это специальным образом форматированная текстовая строка, которая описывает искомую структуру данных. Специальный алгоритм отыскивает в проверяемом тексте соответствия (matchings) заданному шаблону. Испытуемые данные могут удовлетворять или не удовлетворять шаблону регулярного выражения.
Технология регулярных выражений наиболее часто используется в процедурах поиска интересующих данных. Она незаменима при обработке кода HTML, разборе log-файлов и HTTP-заголовков. Достаточно часто шаблоны регулярных выражений используются для проверки правильности заполнения ASP.NET форм. Они также используются в компиляторах на этапе синтаксического анализа исходных текстов программ для поиска ключевых слов, проверки правильности построения языковых конструкций или математических выражений.
Шаблоны регулярных выражений можно использовать и для описания принципов образования данных. Язык описания схем данных XSD использует механизм регулярных выражений для задания схем правильных XML-документов. Регулярные выражения позволяют не только искать данные, но и редактировать документы, составлять отчеты о внесенных изменениях.
Библиотека классов .NET Framework имеет несколько классов, которые удобно использовать для работы с регулярными выражениями. Класс Regex (из пространства имен System.Text.RegularExpressions) инкапсулирует функциональность неизменяемого (immutable) шаблона (regular expression). Он имеет ряд статических методов, позволяющих работать с текстом, не создавая объектов класса Regex.
Класс Match представляет собой результат проверки текста на соответствие схеме регулярного выражения. Не путайте класс Match с методом Regex.Match, который ищет в тексте одно, очередное вхождение выражения и возвращает объект класса Match. Другой метод класса Regex, с именем Matches, ищет все совпадения текста со схемой, заданной регулярным выражением. Он возвращает коллекцию типа MatchCollection, которая по сути является множеством объектов класса Match. Класс Capture инкапсулирует функциональность захвата, то есть части проверяемой строки (подстроки), которая удовлетворяет шаблону. Класс Group является коллекцией объектов класса Capture.
Синтаксис регулярных выражений так же прост, как клинопись Древнего Вавилона, поэтому создание правильного и, что еще сложнее, оптимального выражения требует значительных умственных усилий. Например, следующий фрагмент (часть его найдена в недрах MSDN) получает (с помощью мифической GetEmail) адрес электронной почты и с помощью статического метода IsMatch класса Regex проверяет его синтаксис.
string email = GetEmail();
bool valid = Regex.IsMatch (email,
@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))" +
@"([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
Согласитесь, что впервые столкнувшись с таким выражением, легко впасть в панику, поэтому искусством создания правильных выражений надо овладевать постепенно. Язык описания регулярных выражений использует два типа символов: обычные (literal) и мета-символы (metacharacters). Именно последние являются основным оружием языка и представляют наибольшие трудности при его изучении.
Понятие мета-символа вам хорошо знакомо. Строка "*.*" используется как маска произвольного файла в командных языках многих операционных систем. Здесь символ * является мета-символом, а точка — обычным. Сразу отметим, что "*.*" не является правильным шаблоном (pattern) регулярного выражения. Рассмотрим наиболее простой шаблон регулярного выражения: "Style\d". Здесь escape-последовательность \d является мета-символом (decimal digit). Этому шаблону соответствуют все строки из множества {"Style0", "Style1",...}. Следующее приложение показывает, как проверить это утверждение программным способом.
using System;
using System.Text.RegularExpressions;
namespace MyRegex
{
class TestRegex
{
private string text, pattern;
private void Test()
{
text = "Style";
pattern = @"Style\d"; // Проверяемый текст и шаблон регулярного выражения
//==== Конструируем регулярное выражение с помощью шаблона pattern
Regex ex = new Regex (pattern);
for (int i=0; i<12; i++) // Ограничимся только двенадцатью элементами множества
if (ex.IsMatch (text + i))
Console.WriteLine (ex.Match (text + i) + " matches: " + pattern);
}
[STAThread]
static void Main()
{
TestRegex test = new TestRegex();
test.Test();
}
}
}
Полезно испытать этот код на практике (в рамках консольного приложения), чтобы понять, какие данные возвращают методы Match и IsMatch. Например, результат выражения ex.Match("Style10") — это строка "Style1", т.е. метод Match возвращает первое найденное вхождение шаблона (pattern), или ту часть проверяемой строки (подстроку), которая удовлетворяет шаблону. Если вы при поиске хотите ограничится множеством {"Style0", ..., "Style9"}, то следует изменить шаблон регулярного выражения.
pattern = @"Style\d\b";
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.