Регулярные выражения в Delphi

Другое   22 Апрель 2012  Автор статьи: admin 

Регулярные выражения позволяют удобно и эффективно извлекать определенную информацию (подстроку) из исходной строки в определенном формате.

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

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

1
s:='this is an example abc123123abc this is an example';

Нам необходимо извлечь из этой строки подстроку, находящуюся между подстроками ‘abc’ и подстроку, находящуюся между подстроками ‘this is an example’. Конечно мы можем сначала найти первую позицию подстроки ‘abc’, затем вторую, затем к первой позиции прибавить длину подстроки ‘abc’ и скопировать искомую подстроку между найденными ее позициями. Но это не достаточно удобно, тем более если пример будет гораздо сложнее. Быстро и без затруднений с подобной операцией, да и еще с десятками других, помогает справиться библиотека RegExpr.

Использование библиотеки

Сначала скопируем данную библиотеку в папку с нашим проектом. Теперь подключим ее. Для этого добавим ее название RegExpr в раздел uses. Работа с регулярными выражениями в этой библиотеке реализуется посредством экземпляра класса TRegExpr. Поэтому сначала создадим его следующим образом:

1
2
var
r: TRegExpr;

А затем создадим этот экземпляр:

1
r := TRegExpr.Create;

Теперь можно указать исходную строку:

1
r.InputString := 'this is an example abc123123abc this is an example';

Затем уже мы указываем само регулярное выражение следующим образом:

1
r.Expression := 'abc(.*?)abc(.*?)';

И вот тут и начинается самое интересное. Строка ‘abc(.*?)abc(.*?)’ и называется регулярным выражением, потому что имеет свой определенный синтаксис, т.е. грубо говоря инструкцию по парсингу исходной строки. Эти выражения имеют достаточно обширное количество различных специальных обозначений, с которыми вы можете ознакомиться здесь. Расскажу про наш случай. Обозначение (.*?) указывает на искомую строку. И соответственно, т.к. одно из этих обозначений у нас указано между ‘abc’ и ‘abc’, то эта искомая подстрока будет «123123». Затем у нас присутствует еще такое же обозначение, и его результатом будет подстрока, которая находится после последнего ‘abc’. Таким образом, RegExpr позволяет производить одновременный поиск сразу нескольких подстрок, что несомненно удобно. Другие обозначения и функции регулярных выражений вы можете найти здесь. Теперь разберемся с тем, как же получить готовый результат. Сделать это достаточно просто:

1
2
3
4
5
if r.Exec then
begin
result1 := r.Match[1]; // "123123"
result2 := r.Match[2]; // " this is an example"
end else showmessage('Не найдено');

Здесь result1 и result2 представляют обыкновенные переменные типа string. Стоит заметить, что индексы в Match соответствуют порядковому номеру обозначений «(.*?)» относительно друг друга.
Полный исходный код использования регулярного выражения будет выглядеть следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  r: TRegExpr;
  result1, result2: string;
begin
  r := TRegExpr.Create;
  r.InputString := 'this is an example abc123123abc this is an example';
  r.Expression := 'abc(.*?)abc(.*?)';
  if r.Exec then
  begin
    result1 := r.Match[1]; // "123123"
    result2 := r.Match[2]; // " this is an example"
  end else
    showmessage('Не найдено');
end;

Научиться программировать

  • на Delphi

  • на Java

  • на C++