logo search
C#, 320 стр

Примеры работы с регулярными выражениями

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

string FindMatch(string str, string strpat)

{

Regex pat = new Regex(strpat);

Match match =pat.Match(str);

string found = "";

if (match.Success)

{

found =match.Value;

Console.WriteLine("Строка ={0}\tОбразец={1}\

tНайдено={2}", str,strpat,found);

}

return(found);

}//FindMatch

В качестве входных аргументов функции передается строка str, в которой ищется вхождение, и строка patstr, задающая образец - регулярное выражение. Функция возвращает найденную в результате поиска подстроку. Если соответствия нет, то возвращается пустая строка. Функция начинает свою работу с создания объекта pat класса Regex, конструктору которого передается образец поиска. Затем вызывается метод Match этого объекта, создающий объект match класса Match. Далее анализируются свойства этого объекта. Если соответствие обнаружено, то найденная подстрока возвращается в качестве результата, а соответствующая информация выводится на печать. (Чтобы спокойно работать с классами регулярных выражений, я не забыл добавить в начало проекта предложение: using System.Text.RegularExpressions.)

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

public void TestSinglePat()

{

//поиск по образцу первого вхождения

string str,strpat,found;

Console.WriteLine("Поиск по образцу");

//образец задает подстроку, начинающуюся с символа a,

//далее идут буквы или цифры.

str ="start"; strpat =@"a\w+";

found = FindMatch(str,strpat);

str ="fab77cd efg";

found = FindMatch(str,strpat);

//образец задает подстроку,начинающуюся с символа a,

//заканчивающуюся f с возможными символами b и d в середине

strpat = "a(b|d)*f"; str = "fabadddbdf";

found = FindMatch(str,strpat);

//диапазоны и escape-символы

strpat = "[X-Z]+"; str = "aXYb";

found = FindMatch(str,strpat);

strpat = @"\u0058Y\x5A"; str = "aXYZb";

found = FindMatch(str,strpat);

}//TestSinglePat

Некоторые комментарии к этой процедуре.

Регулярные выражения задаются @-константами, описанными в лекции 14. Здесь они как нельзя кстати.

В первом образце используется последовательность символов \w+, обозначающая, как следует из таблицы 15.1, непустую последовательность латиницы и цифр. В совокупности образец задает подстроку, начинающуюся символом a, за которым следуют буквы или цифры (хотя бы одна). Этот образец применяется к двум различным строкам.

В следующем образце используется символ * для обозначения итерации. В целом регулярное выражение задает строки, начинающиеся с символа a и заканчивающиеся символом f, между которыми находится возможно пустая последовательность символов из b и d.

Последующие два образца демонстрируют использование диапазонов и escape-последовательностей для представления символов, заданных кодами (в Unicode и шестнадцатиричной кодировке).

Взгляните на результаты, полученные при работе этой процедуры.

Рис. 15.1.  Регулярные выражения. Поиск по образцу