Чтение онлайн

ЖАНРЫ

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:
Компиляция и повторное использование регулярных выражений

По умолчанию Regex компилирует регулярные выражения в последовательность внутренних байт-кодов регулярных выражений (это высокоуровневый код, отличный от Microsoft intermediate language (MSIL)). При исполнении регулярных выражений байт-код интерпретируется.

Если же конструировать объект Regex с опцией 'с', он компилирует регулярные выражения в MSIL-код вместо упомянутого байт-кода. Это позволяет JIT-компилятору Microsoft .NET Framework преобразовать выражение в родные машинные коды для повышения производительности.

Но сгенерированный MSIL

нельзя выгрузить. Единственный способ выгрузить код – это выгрузить из памяти приложение целиком. Это значит, что занимаемые скомпилированным регулярным выражением ресурсы нельзя освободить, даже если сам объект Regex уже освобожден и уничтожен сборщиком мусора.

Из-за этого казуса приходится задумываться – стоит ли компилировать регулярные выражения с опцией 'с', и если да, то какие и сколько. Если приложение должно постоянно использовать множество регулярных выражений, придется обойтись интерпретацией. А вот если есть несколько постоянно используемых регулярных выражений, можно и скомпилировать их для ускорения работы.

Для повышения производительности Regex кэширует в памяти все регулярные выражения. Поэтому повторного разбора при каждом очередном использовании не происходит. Такой подход несколько уменьшает разницу в производительности компилируемых и интерпретируемых регулярных выражений.

Приложение RegExpTest

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

Рис.2. Приложение RegExpTest

Мода – великая вещь, поэтому писать приложение следует не на Java, не на VB, а на C#. Это модно, и доказывает, что автор не стоит на месте, а работает над собой.

Отрывки кода этого примера приведены в Листинге 1. Само приложение можно скачать с нашего ftp-сайта.

Листинг 1. Использование регулярных выражений в C#

// Класс для хранения информации о найденном вхождении

protected class MyItem {

 public MyItem(string Match, int Index, int Len) {

this.Match = Match;

this.Index = Index;

this.Len = Len;

 }

 public override string ToString {

return Index.ToString + ", " + Len.ToString + ", " + Match;

 }

 public string Match;

 public int Index;

 public int Len;

}

protected void Parce {

 int iCountMatchs = 0;

 try {

// Очищаем лист-бокс

listBox1.Items.Clear;

statusBar1.Text = "Parsing…";

// создаем объект re, задавая в его конструкторе

// шаблон и опции

Regex re = new Regex(tbPattern.Text, tbOptions.Text);

// Выполняем поиск заданного
выше шаблона внутри

// текста и текстового поля

tbTextForSearch MatchCollection mc = re.Matches(tbTextForSearch.Text);

iCountMatchs = mc.Count;

// Выводим информацию о количестве найденных вхождений…

statusBar1.Text = "Load list (" + iCountMatchs.ToString + ")…";

// …и заносим информацию о них в лист-бокс.

listBox1.BeginUpdate;

foreach(Match m in mc) {

// Для хранения информации о найденном вхождении

// мы используем созданный нами класс MyItem.

// Элементы управления (типа лист-бокса) в .Net

// позволяют хранить вместо текстового значения

// объект, а при отображении текста в строке вызывают

// метод – ToString. Так что объект любого класса,

// реализующего метод ToString, может выступать в

// качестве элемента лист-бокса.

listBox1.Items.Add(new MyItem(m.ToString, m.Index, m.Length));

}

 } catch(Exception e1) {

MessageBox.Show(e1.ToString, "Error");

 } finally {

listBox1.EndUpdate;

statusBar1.Text = "Done " + iCountMatchs.ToString;

 }

}

Заключение

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

ВОПРОС – ОТВЕТ 

Как вывести на экран картинку в JPEG/GIF/PNG/др. формате?

7 способов как это сделать

Автор: Павел Блудов

Демонстрационное приложение (WTL) DrawImg (50kb)

Сегодня практически все программы используют различные картинки в качестве элементов интерфейса. Даже существует API функция ::LoadImage, умеющая загружать файлы в формате bmp, ico и cur. Этого достаточно для панелей управления и диалогов. Но если размер картинки превышает 100x100 пикселов и их нужно несколько, файлы формата bmp использовать не удобно. Хочется что-то вроде jpg или gif.

Тут ::LoadImage нам уже не помошник. Придется использовать специальные библиотеки. Наибольшей популярностью пользуются:

Independent JPEG Group

Portable Network Graphics

TIFF Software

Intel(R) JPEG Library

Image Library

CXImage

Small JPEG Decoder Library

Все они хорошо документированны и снабжены примерами. Подробное рассмотрение этих библиотек займет слишком много времени и выходит за рамки этой статьи. Давайте лучше уделим внимание некоторым специальным API, предназначенным для работы с файлами изображений.

Поделиться с друзьями: