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

Окт 29, 2010


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

Установка

Для установки и подключения модуля необходимо поместить файл regexpr.pas в папку с проектом, а в директиве uses добавить RegExpr.


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

Для начала необходимо объявить переменную класса TRegExpr и создать его экземпляр. После этого присваиваем свойству InputString текст, в котором будет осуществляться поиск по определенной маске. Эту маску, или как его еще называют, шаблон помещаем в свойство Expression.

Функция Exec выполняет поиск по тексту: если с условием шаблона что-либо совпадает, то функция вернет true, или false при несовпадении, соответственно. Получить текст удовлетворяющий маске можно из переменной Match[1].

procedure TfrmMain.FormCreate(Sender: TObject);
var
RegExp: TRegExpr;
begin
 RegExp := TRegExpr.Create;
 RegExp.InputString := 'Delphi <a href="tdlite.exe">download</a> ';
 RegExp.Expression := 'href="(.*?)">(.*?)<';
 if RegExp.Exec then
 begin
  ShowMessage(RegExp.Match[1]); {"tdlite.exe"}
  ShowMessage(RegExp.Match[2]); {"download"}
 end;
 RegExp.Free;
end;

Аналог preg_match_all

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

procedure TfrmMain.FormCreate(Sender: TObject);
var
RegExp: TRegExpr;
begin
 RegExp := TRegExpr.Create;
 RegExp.InputString := 'Delphi <a href="tdlite.exe">download</a>JavaScript<a href="js.exe">download</a> ';
 RegExp.Expression := 'href="(.*?)"';
 if RegExp.Exec then
 repeat
  ShowMessage(RegExp.Match[1]);
 until not RegExp.ExecNext;
 RegExp.Free;
 end;

Одиночная кавычка

Внимательный читатель заметит, что в регулярке не получится воспользоваться символом одиночной кавычки '. Вместо неё можно использовать цифровой код символа #39.

Пример использования

RegExp.Expression := 'href='#39'(.*?)'#39; {href='(.*?)'}

Заключение

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

Скачать regexpr.zip
Размер: 33.5 kB – Скачиваний: 440 – Скачан последний раз: 15.08.2012 08:58

Post to Twitter

Похожие статьи:

  1. Функции кодирования Base64
  2. Количество элементов в IEnumVARIANT
  3. Компонент Antigate для Delphi
  4. Использование XML в Delphi (msxml_tlb)

Комментарии (8)

  1. avatar

    X
    Октябрь 29th, 2010 at 23:23 #

    Автор, спасибо за отличнейшие статьи! Очень интересно, продолжай в том же духе!!!

  2. avatar

    Anvarbek
    Декабрь 13th, 2010 at 21:02 #

    спасибо

  3. avatar

    Алексей
    Январь 11th, 2011 at 07:40 #

    Спасибо за материал.
    После 10 лет на PHP, пока сложно в delphi, да еще и без регулярок, к которым привык, а тут оказывается можно неплохие костылики подставить.

  4. avatar

    Стас
    Апрель 5th, 2011 at 15:47 #

    Тоже после PHP, еще бы описал как включить жадность регулярки

  5. avatar

    Geograph
    Май 12th, 2011 at 22:42 #

    Чтобы воспользоваться одиночной кавычкой (апострофом) не обязательно использовать код этого символа, можно просто ввести апостроф два раза:
    RegExp.Expression := ‘href=»(.*?)» {href=’(.*?)’}

  6. avatar

    GlooK
    Май 13th, 2011 at 15:03 #

    Спасибо, Geograph. Буду знать.

  7. avatar

    Хомяк
    Сентябрь 21st, 2011 at 00:09 #

    Блин сколько времени я потерял разбирая текст через pos. А тут все так просто. Спасибо.

  8. avatar

    Александр
    Октябрь 7th, 2011 at 18:58 #

    Внимательный читатель заметит, что в регулярке не получится воспользоваться символом одиночной кавычки ‘. Вместо неё можно использовать цифровой код символа #39.

    Ну вы и жжете, это же основы синтаксиса паскаля.
    Пишешь в кавычках два раза одинарную и получаешь что надо )))

    RegExp.Expression := ‘href=»(.*?)»’; {href=’(.*?)’}

Ваш комментарий

Rambler's Top100 Яндекс.Метрика