суббота, 12 декабря 2009 г.

Как научить Delphi дружить с RegExp

Приветствую друзья!
Давненько я не писал. Пора возвращаться в колею!
Если кто то из вас пользуется Delphi, то у него наверняка возникала такая мысль: "почему же создатели этого языка не поставляют в комплект регулярные выражения?". Ну у меня точно возникает.
С тех пор как я впервые услышал о RegExp, я постоянно об этом думаю, поскольку на службе приходиться иметь дело именно с Delphi. А используя другие языки, я всё больше убеждался в мощи и удобстве регулярных выражений. И вот, на днях, меня припекло на столько, что сокрушаясь горючими слезами, я чуть было не начал писать RegExp для Delphi самостоятельно.

Запрос в поисковике показал, что ни я один сокрушаюсь по этому поводу, и многие коллеги по цеху, уже прошли этой тропой (написание RegExp). Многие построили свои объекты и классы. Но оказывается, что можно обойтись внутренними возможностями Windows не прибегая к сторонним разработчикам.
Всё, что для этого потребуется это обновленная библиотека VBScript и то только на компьютерах разработчиков, у пользователей скомпилированный проект прекрасно работает и без этого обновления. Правда только для пользователей Windows.

Итак что делаем?
  1. Скачиваем вот это обновление
  2. Устанавливаем скачанное обновление. (Потребуется перезагрузка)
  3. После перезагрузки запускаем Delphi и импортируем библиотеку Microsoft VBScript Regular Expressions
  4. Далее мастер спросит присоединять созданый модуль к текущему проекту или создать новый.
  5. Теперь для использования RegExp необходима в секции uses указать имя созданного модуля VBScript_RegExp_55_TLB

Вот и всё теперь Delphi умеет использовать Регулярные выражения.
Использовать выражение в программе теперь достаточно просто. Вот листинг такой функции:
Дополнительную справку можно получить в MSDN
Function TestRegExp( aIncomming : String): String;
var
  Reg : TRegExp;
begin
  Reg := TRegExp.Create(nil); //создаём класс
  try
    Reg.Pattern := '([^/]|/[^/])+//'; //записываем регулярное выражение
    Result := ((Reg.Execute(aIncomming) as MatchCollection)[0] as Match).Value; // получаем первое совпадение
  finally
    Reg.Free;
  end;
end;

P.S. Картинки с установкой VBScript размещу в понедельник

 
 
 

8 комментариев:

  1. Еще можно сделать вот так:

    function TForm1.TestRegExp(aIncomming: string): string;
    var
    RegExp : Variant;
    Matches : Variant;
    Match : Variant;
    begin
    Result := '';
    try
    RegExp := CreateOleObject('VBScript.RegExp');
    RegExp.Pattern := '([^/]|/[^/])+//';
    Matches := RegExp.Execute(aIncomming);
    if Matches.Count > 0 then
    begin
    Match := Matches.Item[0];
    Result := Match.Value;
    Match := Null;
    end;
    finally
    Matches := Null;
    RegExp := Null;
    end;
    end;

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

    ОтветитьУдалить
  2. Ну да, если не будет то будет валиться. Но по заверениям Microsoft эта библиотека идет во всех Windows от 98 и младше.

    ОтветитьУдалить
  3. Я не сомневаюсь, просто вот эта фраза немного неточна:
    "Всё, что для этого потребуется это обновленная библиотека VBScript и то только на компьютерах разработчиков, у пользователей скомпилированный проект прекрасно работает и без этого обновления."

    Хотя может действительно работать будет без обновления, только тогда непонятно нафига ставить это обновление? без него импорт не проходил что-ли?

    ОтветитьУдалить
  4. Ага, без него в списке импортируемых библиотек нет нужной.

    ОтветитьУдалить
  5. Лучше используй обёртку для библиотеки PCRE (Perl Compatible Regular Expressions). Это лучшее, что может быть для регулярных выражений. Большинсво нового функционала для re было введенено именно в Perl.

    Одну из обётрок взять можно тут: http://www.regular-expressions.info/download/TPerlRegEx.zip

    ОтветитьУдалить
  6. А клиентам, библиотеки придётся устанавливать?

    ОтветитьУдалить
  7. Нет, можно будет просто положить в папочку с программое файлик pcrelib.dll

    Ну и попутно: А клиентам, WindowsXP-Windows2000-Script56-KB917344-x86-rus.exe придётся устанавливать?

    ОтветитьУдалить
  8. Нет, она идёт с Windows. Но я ещё завтра 100% уточню на 3 пк не пришлось вообще ничего делать. А обновить её нужно что бы в Delphi импортировать. Ну а что dll тоже дело. Спасибо за совет.

    ОтветитьУдалить