Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Регулярное выражение – это шаблон, по которому выполняется поиск соответствующего фрагмента текста. Язык описания регулярных выражений состоит из символов двух видов: обычных символов и метасимволов. Обычный символ представляет в выражении сам себя, а метасимвол – некоторый класс символов.

Рассмотрим наиболее употребительные метасимволы:

 

Класс символов Описание Пример
. Любой символ, кроме \n. Выражение c.t соответствует фрагментам: cat, cut, c#t, c{t и т.д.
[] Любой одиночный символ из последовательности, записанной внутри скобок. Допускается использование диапазонов символов. Выражение c[aui]t соответствует фрагментам: cat, cut, cit. Выражение c[a-c]t соответствует фрагментам: cat, cbt, cct.
[^] Любой одиночный символ, не входящий в последовательность, записанную внутри скобок. Допускается использование диапазонов символов. Выражение c[^aui]t соответствует фрагментам: cbt, cct, c2t и т.д. Выражение c[^a-c]t соответствует фрагментам: cdt, cet, c%t и т.д.
\w Любой алфавитно-цифровой символ. Выражение c\wt соответствует фрагментам: cbt, cct, c2t и т.д., но не соответствует фрагментам c%t, c{t и т.д.
\W Любой не алфавитно-цифровой символ. Выражение c\Wt соответствует фрагментам: c%t, c{t, c.t и т.д., но не соответствует фрагментам cbt, cct, c2t и т.д.
\s Любой пробельный символ. Выражение \s\w\w\w\s соответствует любому слову из трех букв, окруженному пробельными символами.
\S Любой не пробельный символ. Выражение \s\S\S\S\s соответствует любым трем непробельным символам, окруженным пробельными.
\d Любая десятичная цифра Выражение c\dt соответствует фрагментам: c1t, c2t, c3t и т.д.
\D Любой символ, не являющийся десятичной цифрой Выражение c\Dt не соответствует фрагментам: c1t, c2t, c3t и т.д.

 

Кроме метасимволов, обозначающие классы символов, могут применяться уточняющие метасимволы:

 

Уточняющие символы Описание
^ Фрагмент, совпадающий с регулярными выражениями, следует искать только в начале строки
$ Фрагмент, совпадающий с регулярными выражениями, следует искать только в конце строки
Фрагмент, совпадающий с регулярными выражениями, следует искать только в начале многострочной строки
\Z Фрагмент, совпадающий с регулярными выражениями, следует искать только в конце многострочной строки
\b Фрагмент, совпадающий с регулярными выражениями, начинается или заканчивается на границе слова, т.е. между символами, соответствующими метасимволам \w и \W
\B Фрагмент, совпадающий с регулярными выражениями, не должен встречаться на границе слов

 

В регулярных выражениях часто используются повторители – метасимволы, которые располагаются непосредственно после обычного символа или группы символов и задают количество его повторений в выражении.

 

Повторители Описание Пример
* Ноль или более повторений предыдущего элемента Выражение ca*t соответствует фрагментам: ct, cat, caat, caaat и т.д.
+ Одно или более повторений предыдущего элемента Выражение ca+t соответствует фрагментам: cat, caat, caaat и т.д.
? Не более одного повторения предыдущего элемента Выражение ca?t соответствует фрагментам: ct, cat.
{n} Ровно n повторений предыдущего элемента Выражение ca{3}t соответствует фрагменту: cаааt. Выражение (cat){2} соответствует фрагменту: cаtcat.
{n,} По крайней мере n повторений предыдущего элемента Выражение ca{3,}t соответствует фрагментам: cаааt, caaaat, caaaaaaat и т.д. Выражение (cat){2,} соответствует фрагментам: cаtcat, catcatcat и т.д.
{n, m} От n до m повторений предыдущего элемента Выражение ca{2, 4}t соответствует фрагментам: cааt, caaat, caaaat.

 

Регулярное выражение записывается в виде строкового литерала, причем перед строкой необходимо ставить символ @, который говорит о том, что строку нужно будет рассматривать и в том случае, если она будет занимать несколько строчек на экране. Однако символ @ можно не ставить, если в качестве шаблона используется шаблон без метасимволов.

Замечание. Если нужно найти какой-то символ, который является метасимволом, например, точку, можно это сделать защитив ее обратным слэшем. Т.е. просто точка означает любой одиночный символ, а \. означает просто точку.

Примеры регулярных выражений:

1) слово rus – @"rus" или "rus"

2) номер телефона в формате xxx-xx-xx – @"\d\d\d-\d\d-\d\d" или @"\d{3}(-\d\d){2}"

3) номер автомобиля - @"[A-Z]\d{3}[A-Z]{2}\d{2,3}RUS"

 

Задания. Запишите регулярное выражение, соответствующее:

1. дате в формате дд.мм.гг или дд.мм.гггг

2. времени в формате чч.мм или чч:мм

3. целому числу (со знаком и без)

4. вещественному числу (со знаком и без, с дробной частью и без, с целой частью и без)

Поиск в тексте по шаблону

Пространство имен библиотеки базовых классов System.Text.RegularExpressions содержит все объекты платформы.NET Framework, имеющие отношение к регулярным выражениям. Важнейшим классом, поддерживающим регулярные выражения, является класс Regex, который представляет неизменяемые откомпилированные регулярные выражения. Для описания регулярного выражения в классе определено несколько перегруженных конструкторов:

4) Regex() – создает пустое выражение;

5) Regex(String) – создает заданное выражение;

6) Regex(String, RegexOptions) – создает заданное выражение и задает параметры для его обработки с помощью элементов перечисления RegexOptions (например, различать или нет прописные и строчные буквы).

Поиск фрагментов строки, соответствующих заданному выражению, выполняется с помощью методов IsMach, Mach, Matches класса Regex.

Метод IsMach возвращает true, если фрагмент, соответствующий выражению, в заданной строке найден, и false в противном случае. Например, попытаемся определить, встречается ли в заданном тексте слово собака:

#include "stdafx.h"

// regex_replace.cpp

// compile with: /clr

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

int main()

{

Regex^ r = gcnew Regex("собака",RegexOptions::IgnoreCase);

String^ text1 = "Кот в доме, собака в конуре.";

String^ text2 = "Котик в доме, собачка в конуре.";

Console::WriteLine("{0}",r->IsMatch(text1));

Console::WriteLine(r->IsMatch(text2));

system("Pause");

return 0;

}

Замечание. RegexOptions::IgnoreCase – означает, что регулярное выражение применяется без учеба регистра символов

 

Можно использовать конструкцию выбора из нескольких элементов. Варианты выбора перечисляются через вертикальную черту. Например, попытаемся определить, встречается ли в заданном тексте слов собака или кот:

#include "stdafx.h"

// compile with: /clr

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

int main()

{

Regex^ r = gcnew Regex("собака|кот",RegexOptions::IgnoreCase);

String^ text1 = "Кот в доме, собака в конуре.";

String^ text2 = "Котик в доме, собачка в конуре.";

Console::WriteLine(r->IsMatch(text1));

Console::WriteLine(r->IsMatch(text2));

system("Pause");

return 0;

}

 

Попытаемся определить, есть ли в заданных строках номера телефона в формате xx-xx-xx или xxx-xx-xx:

#include "stdafx.h"

// compile with: /clr

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

int main()

{

Regex^ r = gcnew Regex("\\d{2,3}(-\\d\\d){2}");

String^ text1 = "tel:123-45-67";

String^ text2 = "tel:no";

String^ text3 = "tel:12-34-56";

Console::WriteLine(r->IsMatch(text1));

Console::WriteLine(r->IsMatch(text2));

Console::WriteLine(r->IsMatch(text3));

system("Pause");

return 0;

}

 

Задание. Измените программу так, чтобы можно было определить, содержится в тексте дата в формате дд.мм.гг.

 

Метод Match класса Regex не просто определяет, содержится ли текст, соответствующий шаблону, а возвращает объект класса Match – последовательность фрагментов текста, совпавших с шаблоном. Следующий пример позволяет найти все номера телефонов в указанном фрагменте текста:

#include "stdafx.h"

// compile with: /clr

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

int main()

{

Regex^ r = gcnew Regex("\\d{2,3}(-\\d\\d){2}");

String^ text = "Контакты в Москве tel:123-45-67, 123-34-56; fax:123-56-45 " +

"Контакты в Саратове tel:12-34-56; fax:12-56-45";

Match^ tel = r->Match(text);

while (tel->Success) {

Console::WriteLine(tel);

tel = tel->NextMatch();

}

system("Pause");

return 0;

}

 

Следующий пример позволяет подсчитать сумму целых чисел, встречающихся в тексте:

#include "stdafx.h"

// compile with: /clr

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

int main()

{

Regex^ r = gcnew Regex("[-+]?\\d+");

String^ text = "5*10=50 -80/40=-2";

Match^ teg = r->Match(text);

int sum = 0;

while (teg->Success) {

Console::WriteLine(teg);

sum += int::Parse(teg->ToString());

teg = teg->NextMatch();

}

Console::WriteLine("sum=" + sum);

system("Pause");

return 0;

}

Задание. Измените программу так, чтобы на экран дополнительно выводилось количество найденных чисел.

 

Метод Matches класса Regex возвращает объект класса MatchCollection – коллекцию всех фрагментов заданной строки, совпавших с шаблоном. При этом метод Matches многократно запускает метод Match, каждый раз начиная поиск с того места, на котором закончился предыдущий поиск.

#include "stdafx.h"

// compile with: /clr

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

void main()

{

String^ text = "5*10=50 -80/40=-2";

Regex^ theReg = gcnew Regex("[-+]?\\d+");

MatchCollection^ theMatches = theReg->Matches(text);

for each (Match^ theMatch in theMatches)

{

Console::Write("{0} ", theMatch->ToString());

Console::WriteLine();

}

system("Pause");

}

 

Редактирование текста

Регулярные выражения могут эффективно использоваться для редактирования текста. Например, метод Replace класса Regex позволяет выполнять замену одного фрагмента текста другим или удаление фрагментов текста:

Пример 1. Изменение номеров телефонов:

// compile with: /clr

#include "stdafx.h"

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

void main()

{

String^ text = "Контакты в Москве tel:123-45-67, 123-34-56; fax:123-56-45. " +

"Контакты в Саратове tel:12-34-56; fax:11-56-45";

Console::WriteLine("Старые данные\n"+text);

String^ newText=Regex::Replace(text, "123-", "890-");

Console::WriteLine("Новые данные\n" + newText);

 

system("Pause");

}

 

Задание. Измените программу так, чтобы шестизначные номера заменялись на семизначные добавлением 0 после первых двух цифр. Например, номер 12-34-56 заменился бы на 120-34-56.

 

Пример 2. Удаление всех номеров телефонов из текста:

 

// compile with: /clr

#include "stdafx.h"

#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

void main()

{

String^ text = "Контакты в Москве tel:123-45-67, 123-34-56; fax:123-56-45. " +

"Контакты в Саратове tel:12-34-56; fax:12-56-45";

Console::WriteLine("Старые данные\n"+text);

String^ newText=Regex::Replace(text, "\\d{2,3}(-\\d\\d){2}", "");

Console::WriteLine("Новые данные\n" + newText);

system("Pause");

}

 

 

Задание. Измените программу так, чтобы из текста удалялись слова tel и fax (если после данных слов стоят двоеточия, то их тоже следует удалить).

 

Пример 3. Разбиение исходного текста на фрагменты:

// compile with: /clr

#include "stdafx.h"

//#using <System.dll>

using namespace System::Text::RegularExpressions;

using namespace System;

#include <iostream>

void main()

{

String^ text = "Контакты в Москве tel:123-45-67, 123-34-56; fax:123-56-45. " +

"Контакты в Саратове tel:12-34-56; fax:12-56-45";

Regex::Split(text,"[,.:;]+");

array<String^>^ newText = Regex::Split(text,"[,.:;]+");

for each(String^ a in newText)

Console::WriteLine(a);

 

system("Pause");

}

Задание. Разместите текст на одной строке и посмотрите, как изменится вывод данных. Объясните результаты.


Лабораторная работа № 23. Регулярные выражения в С++ в платформе.NET Framework

Цель работы:

Овладеть навыками использования регулярных выражений с использованием библиотеки в платформе.NET Framework

Задание

Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются пробелами и знаками препинания.

 

1) Определите, содержится ли в сообщении заданное слово.

2) Выведите все слова заданной длины.

3) Выведите на экран все слова сообщения, записанные с заглавной буквы.

4) Удалите из сообщения все однобуквенные слова.

5) Удалите из сообщения все знаки препинания.

6) Удалите из сообщения все русские слова.

7) Удалите из сообщения только те русские слова, которые начинаются на гласную букву.

8) Заменить все английские слова на многоточие.

9) Найти максимальное целое число, встречающееся в сообщении.

10) Найти сумму всех имеющихся в тексте чисел (целых и вещественных, причем вещественное число может быть записано в экспоненциальной форме).

11) В сообщении могут встречаться номера телефонов, записанные в формате xx-xx-xx, xxx-xxx или xxx-xx-xx. Вывести все номера телефонов, которые содержатся в сообщении.

12) В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд – целое число из диапазона от 1 до 31, мм – целое число из диапазона от 1 до 12, а гггг – целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Выведите на экран все даты, которые относятся к текущему году.

13) В сообщении могут содержаться IP-адреса компьютеров в формате d.d.d.d, где d – целое число из диапазона от 0 до 255. Вывести все IP-адреса содержащиеся в тексте.

14) В сообщении могут содержаться IP-адреса компьютеров в формате d.d.d.d, где d – целое число из диапазона от 0 до 255. Удалить из сообщения IP-адреса, в которых последнее число d начинается с заданной цифры (данная цифра вводится с клавиатуры).

15) Выведите на экран все адреса web-сайтов, содержащиеся в сообщении.

16) В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд – целое число из диапазона от 1 до 31, мм – целое число из диапазона от 1 до 12, а гггг – целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Замените каждую дату сообщения на дату следующего дня.

17) В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд – целое число из диапазона от 1 до 31, мм – целое число из диапазона от 1 до 12, а гггг – целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Замените каждую дату в сообщении на дату предыдущего дня.

18) В сообщении может содержаться время в формате чч:мм:сс. В заданном формате чч – целое число из диапазона от 00 до 24, мм и сс – целые числа из диапазона от 00 до 60 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Преобразуйте каждое время к формату чч:мм, применив правило округления до целого числа минут.

19) В сообщении может содержаться время в формате чч:мм. В заданном формате чч – целое число из диапазона от 00 до 24, мм – целое число из диапазона от 00 до 60 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Увеличите время на n минут.

20) В сообщении может содержаться время в формате чч:мм. В заданном формате чч – целое число из диапазона от 00 до 24, мм – целое число из диапазона от 00 до 60 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Уменьшите время на n часов.

 

 

Содержание отчета

1) Титульный лист.

2) Наименование и цель работы.

3) Краткое теоретическое описание.

4) Задание на лабораторную работу.

5) Листинг программы.

6) Результаты выполнения программы.


 

18. Создание Windows-приложений на платформе Microsoft.Net C++

Краткая теория

Философия.NET Framework

CLR (Common Language Runtime) – общеязыковая среда выполнения.

CLR — это место, в.NET Framework, где выполняется, сгенерированный компилятором, CIL код. Задачи CLR: управление памятью, загрузка сборок, безопасность, обработка исключений, синхронизация и т.д.

Выглядит немного запутано, но давайте прольем свет на детали.

Когда мы пишем на С++, компилятор генерирует специальный CIL код, который понимает и выполняет CLR. Так как CLR не полиглот, то для каждого языка, поддерживаемого в.NET, есть свой компилятор, который занимается проверкой написанного и генерированием CIL кода. Именно эта особенность и дает нам возможность писать на разных языках под одну и ту же платформу.

 

Что такое CIL код? CIL (Common Intermediate Language) – промежуточный язык, для платформы.NET. Но между чем и чем он промежуточный?

IL является промежуточным между языком высокого уровня (C++) и машинными командами. CLR во время выполнения IL кода генерирует машинные команды, которые выполняются процессором.

 

Но почему мы не можем выбрать один язык и разрабатывать только на нем?

С одной стороны, у нас есть, «неуправляемый код» C++, который дает доступ к системе на низком уровне (распоряжение памятью, создание программных потоков и т.д.) С другой стороны, Visual Basic позволяет очень быстро строить пользовательские интерфейсы и легко управлять COM-объектами и базами данных.

В зависимости от поставленной задачи мы можем выбирать более подходящий инструмент, для достижения поставленных целей.

 

Выводы:

•.NET Framework предоставляет возможность выбора разных языков;

• CLR – ключевой механизм, в платформе.NET;

• CIL – язык, который генерируют все компиляторы всех языков.NET для CLR;

• Нет универсального инструмента для решения любой задачи.

 

Язык С++. Основные конструкции

В платформу.Net входят много языков, которые без особого труда интегрируются друг с другом. Мы будем рассматривать язык C++.

Библиотека Windows Forms

Все рассмотренное выше является основой всех приложений.Net и удобно для создания консольных приложений, однако для создания серьезных приложений лучше подходит Microsoft Visual Studio 2005 и выше.

WindowsForms – подмножество типов библиотеки FCL для создания пользовательского интерфейса приложений. Все типы WindowsForms находятся в пространстве имен System::Windows::Forms.

Внешний вид Windows-приложения на стадии разработки в Microsoft Visual Studio 2008 представлен на рисунке.

 

Принцип визуального проектирования приложения в Visual Studio 2008 тот же, что и в Delphi. Visual Studio 2008 позволяет создавать как MDI, так и SDI-приложения.



Поделиться:


Последнее изменение этой страницы: 2016-12-11; просмотров: 817; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.34.237 (0.015 с.)