пятница, 24 июля 2015 г.

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

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


Регулярные выражения очень мощный инструмент для работы с подстроками в тексте. Они очень помогают мне при анализе текстовых файлов. В данной заметке хочу описать два возможных варианта использования регулярных выражений в Delphi. Первый это библиотека TRegExpr(http://regexpstudio.com/), но к сожалению она не поддерживает некоторый синтаксис. Её можно использовать на старых версия Delphi. Начиная с Delphi XE появился встроенный механизм работы с регулярными выражении и находится он в модуле RegularExpressions.pas(http://docwiki.embarcadero.com/Libraries/XE8/en/System.RegularExpressions), это более современная реализация.

Основной синтаксис регулярных выражений можно посмотреть на следующих ресурсах:
Шпаргалка по регулярным выражениям
Синтаксис регулярных выражений
Регулярные выражения
Синтаксис регулярного выражения
Регулярные выражения в Java
Регулярные выражения в Java (regexp)
http://htmlweb.ru/php/example/preg.php
Регулярные выражения
Регулярные выражения в Delphi
Delphi XE. Работа с регулярными выражениями

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

(?<=:)\w+

Но к сожалению TRegExpr не поддерживает синтаксис определения впереди стоящего символа. В этом случае последовательно будем применять 2 регулярных выражения.

:\w+

и

\w+

Пример на TRegExpr


function GetWordAfterColon: string;

var
  RegExp:TRegExpr;
  RegExpMath:TRegExpr;
begin
  Result:='';
  RegExp:=TRegExpr.Create;//первое регулярное выражение
  RegExpMath:=TRegExpr.create;//второе регулярное выражение
  try
    RegExp.Expression := ':\w+';//задаем выражение поиска слова с :
    RegExpMath.Expression := '\w+';//поиск слова
    if RegExp.Exec(Str) then//находим слово с двоеточием
    begin
      RegExpMath.Exec(RegExp.Match[0]);//из найденной строки ищем просто слово
      Result:=RegExpMath.Match[0];//получаем нужное значение
    end;
  finally
    RegExp.Free;
    RegExpMath.free;
  end;
end;

Пример на RegularExpressions

function GetWordAfterColon: string;
var
  RegEx: TRegEx;
  M: TMatchCollection;
  i,j:integer;
begin
  Result:='';
  RegEx:=TRegEx.Create('(?<=:)\w+');//задаем регулярное выражение
  M:=RegEx.Matches(str);//получаем коллекцию совпадений
  for  i:=0 to M.Count-1 do//идём по коллекции
  begin
    Result:=M.Item[i].Value;//получаем значение
    break;
  end;
end;
Также хочу оставить здесь ссылки на онлайн сервисы проверки регулярных выражений:
http://regexpal.com/
http://sharpdev.ru/Regex/Sharp - на момент написания сервер упал
http://regexr.com/
https://regex101.com/#pcre

Комментариев нет:

Отправить комментарий