- •Методические указания к лабораторным работам
- •Лабораторная работа 1 Встроенные типы данных в с#. Массивы. Строки. Регулярные выражения
- •Задания к лабораторной работе
- •Краткие теоретические сведения
- •Типы данных c#
- •Массивы в c#
- •Базовый класс System.Array
- •Строки в с# Класс Сhar. Использует двухбайтную кодировку символов Unicode. Константу можно задавать:
- •Строковые константы. В c# существуют два вида строковых констант:
- •Пространство имен RegularExpression
- •Вопросы к защите лабораторной работы
- •Лабораторная работа 2 Типы данных, определяемые пользователем. Наследование. Обработка исключений в с#
- •Задания к лабораторной работе
- •Краткие теоретические сведения
- •[Атрибуты][модификаторы]enum имя_перечисления [: базовый класс] {список_возможных_значений}
- •[Атрибуты][модификаторы]struct имя_структуры [:список_интерфейсов] {тело_структуры}
- •[Атрибуты][модификаторы]class имя_класса [:список_родителей] {тело_класса}
- •Индексатор. Обеспечивает доступ к закрытому полю, представляющему массив. Объекты класса индексируются по этому полю. У класса может быть только один индексатор со стандартным именем this.
- •Две стратегии реализации интерфейса. Опишем некоторый интерфейс, задающий дополнительные свойства объектов класса:
- •1. Коллизия имен
- •2. Наследование от общего предка
- •Краткие теоретические сведения
- •Режимы дизайна и кода
- •Элементы управления
- •Обработка событий в Windows Forms
- •Создание меню
- •Закрытие формы
- •Диалоговые окна
- •Создание панели инструментов
- •Список элементов ListBox
- •Вопросы к защите лабораторной работы
- •Краткие теоретические сведения Операции ввода/вывода данных в .Nет
- •Разработка многооконного приложения
- •Диалоговые окна
- •Вопросы к защите лабораторной работы
Пространство имен RegularExpression
Регулярные выражения — это один из способов поиска подстрок (соответствий) в строках. Осуществляется с помощью просмотра строки в поисках некоторого шаблона. Очень эффективны. Библиотеки, интерпретирующие регулярные выражения, обычно пишутся на низкоуровневых высокопроизводительных языках (С, C++, Assembler). С помощью регулярных выражений выполняются три действия:
• проверка наличия соответствующей шаблону подстроки;
• поиск и выдача пользователю соответствующих шаблону подстрок;
• замена соответствующих шаблону подстрок.
Синтаксис регулярных выражений. Регулярное выражение на C# задается строковой константой. Обычно используется @-константа. В С# работа с регулярными выражениями выглядит следующим образом:
Regex re = new Regex(«образец», «опции»);
MatchCollection me = re.Matches(“строка для поиска”);
iCountMatchs = me.Count;
где re — это объект типа Regex. В конструкторе ему передается образец поиска и опции.
Таблица 1.8 – Символы описания шаблона
Символ |
Интерпретация |
|
Категория: подмножества (классы) символов |
. |
Соответствует любому символу, за исключением символа конца строки |
[aeiou] |
Соответствует любому символу из множества, заданного в квадратных скобках |
[^aeiou] |
Отрицание. Соответствует любому символу, за исключением символов, заданных в квадратных скобках |
[0-9a-fA-F] |
Задание диапазона символов, упорядоченных по коду. Так, 0-9 задает любую цифру |
\w |
Множество символов, используемых при задании идентификаторов – большие и малые символы латиницы, цифры и знак подчеркивания |
\s |
Соответствует символам белого пробела |
\d |
Соответствует любому символу из множества цифр |
|
Категория: Операции (модификаторы) |
* |
Итерация. Задает ноль или более соответствий; например, \w* или (abc)*. Аналогично, {0,} |
+ |
Положительная итерация. Задает одно или более соответствий; например, \w+ или (abc)+. Аналогично, {1,} |
? |
Задает ноль или одно соответствие; например, \w? Или (abc)?. Аналогично, {0,1} |
{n} |
Задает в точности n соответствий; например, \w{2} |
{n,} |
Задает, по меньшей мере, n соответствий; например, (abc){2,} |
|
Категория: Группирование |
(?<Name>) |
При обнаружении соответствия выражению, заданному в круглых скобках, создается именованная группа, которой дается имя Name. |
() |
Круглые скобки разбивают регулярное выражение на группы. Для каждого подвыражения, заключенного в круглые скобки, создается группа, автоматически получающая номер. |
Класс Regex. Это основной класс, объекты которого определяют регулярные выражения. В конструктор класса передается в качестве параметра строка, задающая регулярное выражение. Основные методы класса Regex:
метод Match запускает поиск первого соответствия. Параметром передается строка поиска. Метод возвращает объект класса Match, описывающий результат поиска.
Программа 5. Поиск первого соответствия шаблону
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);
}
public void TestSinglePat(){
string str, strpat, found;
Console.WriteLine("Поиск по образцу");
//образец задает подстроку, начинающуюся с символа a,
//далее идут буквы или цифры.
str ="start"; strpat =@"a\w+";
found = FindMatch(str,strpat); //art
str ="fab77cd efg";
found = FindMatch(str,strpat); //ab77cd
//образец задает подстроку, начинающуюся с символа a,
//заканчивающуюся f с возможными символами b и d в середине
strpat = "a(b|d)*f"; str = "fabadddbdf";
found = FindMatch(str,strpat); //adddbdf
}
метод Matches позволяет разыскать все непересекающиеся вхождения подстрок, удовлетворяющие образцу. В качестве результата возвращается объект MatchCollection, представляющий коллекцию объектов Match.
Программа 6. Поиск всех соответствий шаблону
void FindMatches(string str, string strpat) {
Regex pat = new Regex(strpat);
MatchCollection match =pat.Matches(str);
Console.WriteLine("Строка ={0}\tОбразец={1}\t
Найдено={2}", str,strpat,match.Count);
}
Console.WriteLine("око и рококо");
strpat="око"; str = "рококо";
FindMatches(str, strpat); //найдено 1 соответствие
метод NextMatch запускает новый поиск.
метод Split является обобщением метода Split класса String. Он позволяет, используя образец, разделить искомую строку на элементы.
static void Main() {
string si = "Один, Два, Три, Строка для разбора";
Regex theRegex = new Regex(" |, |,");
int id = 1;
foreach (string substring in theRegex.Split(si))
Console.WriteLine("{0}: {1}", id++, substring);
}
метод Replace – позволяет делать замену найденного образца. Метод перегружен. При вызове метода передаются 2 строки - первая задает строку, в которой необходимо произвести замену, а вторая - на что нужно заменить найденную подстроку.
Regex r = new Regex(@"(a+)");
string s="bacghghaaab";
s=r.Replace(s,"_$1_"); // $1 – соответствует группе (а+)
Console.WriteLine("{0}",s);
Третий параметр указывает сколько замен нужно произвести:
Regex r = new Regex(@"(dotsite)");
string s="dotsitedotsitedotsiterulez";
s=r.Replace(s,"f",1); Console.WriteLine("{0}",s);
Четвертый параметр указывает с какого вхождения производить замены:
Regex r = new Regex(@"(dotsite)");
string s="dotsitedotsitedotsiterulez";
s=r.Replace(s,"f",2,1); Console.WriteLine("{0}",s);
Классы Match и MatchCollection. Коллекция MatchCollection, позволяет получить доступ к каждому ее элементу - объекту Match. Для этого можно, использовать цикл foreach.
При работе с объектами класса Match наибольший интерес представляют свойства класса. Рассмотрим основные свойства:
свойства Index, Length и Value наследованы от прародителя Capture. Они описывают найденную подстроку- индекс начала подстроки в искомой строке, длину подстроки и ее значение;
свойство Groups класса Match возвращает коллекцию групп - объект GroupCollection, который позволяет работать с группами, созданными в процессе поиска соответствия;
свойство Captures, наследованное от объекта Group, возвращает коллекцию CaptureCollection.
Программа 7. Поиск всех образцов, соответствующих регулярному выражению
public static void Main( ) {
string si = "Это строка для поиска";
// найти любой пробельный символ следующий за непробельным
Regex theReg = new Regex(@"(\S+)\s");
// получить коллекцию результата поиска
MatchCollection theMatches = theReg.Matches (si);
// перебор всей коллекции
foreach (Match theMatch in theMatches) {
Console.WriteLine( "theMatch.Length: {0}",
theMatch.Length);
if (theMatch.Length != 0)
Console.WriteLine("theMatch: {0}", theMatch.ToString( ));
} }
Классы Group и GroupCollection. Коллекция GroupCollection возвращается при вызове свойства Group объекта Match. Имея эту коллекцию, можно добраться до каждого объекта Group.
Свойства создаваемых групп:
при обнаружении одной подстроки, удовлетворяющей условию поиска, создается не одна группа, а коллекция групп;
группа с индексом 0 содержит информацию о найденном соответствии;
число групп в коллекции зависит от числа круглых скобок в записи регулярного выражения. Каждая пара круглых скобок создает дополнительную группу;
группы могут быть индексированы, но могут быть и именованными, в круглых скобках разрешается указывать имя группы.
Создание именованных групп крайне полезно при разборе строк, содержащих разнородную информацию. Например:
Программа 8. Создание именованных групп
public static void Main( ) {
string stringl = "04:03:27 127.0.0.0 GotDotNet.ru";
Regex theReg = new Regex( @"(?<время>(\d|\:)+)\s" +
@"(?<ip>(\d|\ .)+)\s" + @"(?<url>\S+)");
// группа time - одна и более цифр или двоеточий, за которыми следует пробельный символ
// группа ip адрес - одна и более цифр или точек, за которыми следует пробельный символ
// группа url - один и более непробельных символов
MatchCollection theMatches = theReg.Matches (stringl);
foreach (Match theMatch in theMatches) {
if (theMatch.Length != 0) {
// выводим найденную подстроку
Console.WriteLine("\ntheMatch: {0}", theMatch.ToString ());
// выводим группу "time"
Console.WriteLine ("время: {0}", theMatch.Groups["время"]);
// выводим группу "ip"
Console.WriteLine("ip: {0}", theMatch.Groups["ip"]);
// выводим группу "url"
Console.WriteLine("url: {0}", theMatch.Groups["url"]);
}}}
