Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Делфи и регулярные выражения


Автор: Berliner 3.5.2006, 13:18
Здраствуйте ,возможно ли к Delphi "прикрутить"  регулярные выражения? ЧТо бы работать с ними можно было например как в Java или в Perl? 

Автор: _hunter 3.5.2006, 13:27
можно:
http://regexpstudio.com/TRegExpr/TRegExpr.html 

Автор: Berliner 4.5.2006, 15:52
Спасиб, А кто нить работал с этой библиотекой? П то у меня не полусется разобрать файл 

Автор: Alexeis 4.5.2006, 15:56
Berliner, поточнее, что не получается? 

Автор: Berliner 4.5.2006, 18:00
 Спасиб. мне бы пример

 Создал я объект,

r:=TRegExp.Create;

а дальше хочу- например отыскать в файле слово tel
и мне хочется посмотреть как именно в Делфи использовать регулярные выражения 

Может кто знает?  

Автор: Alexeis 5.5.2006, 10:36
Там в пакете есть неплохие демки 
Вот привожу фрагмент
Код

function ExtractEmails (const AInputString : string) : string;
// созданный TRegExpr с уже откомпилированным выражением
 const
  EmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';
 var
  r : TRegExpr;
 begin
  Result := '';
  r := TRegExpr.Create;
  try // гарантирует освобождение занятой объектом памяти
     r.Expression := EmailRE;
    // Присваиваем исходный текст регулярного выражения.
    // При первой же необходимости (например, при вызове метода Exec)
    // оно будет откомпилировано. Если в выражении есть ошибки, то 
    // будет вызвано исключение
     if r.Exec (AInputString) then // если выражение найдено то
      REPEAT                                // добавляем к результату 
       Result := Result + r.Match [0] + ',';
      UNTIL not r.ExecNext;    
    finally r.Free;
   end;
 end;


функция exec имеет 3 перегруженных варианта.
r.Match [0] - возращает первое появление.
r.ExecNext; - ищет следующее выражение.
Текст в котором нужно искать можно задать вручную свойством 
property InputString 
или автоматически при вызове Exec (AInputString)

Для правельной работы желательно установить нужные модификаторы они задают режим работы компонента
Цитата

property ModifierI : boolean;
Модификатор /i - ("регистро-независимый режим"), инициализируется из RegExprModifierI
property ModifierR : boolean;
Модификатор /r ("русские диапазоны"), инициализируется из RegExprModifierR
property ModifierS : boolean
Модификатор /s - если установлен, то '.' совпадает с любым символом, (если сброшен, то '.' не совпадает с LineSeparators и LinePairedSeparator, , инициализируется из RegExprModifierS
property ModifierG : boolean;
Модификатор /g, отключение приводит к тому, что все операторы работают в "не жадном" (non-greedy) режиме, т.е. когда ModifierG = False, то все '*' работают как '*?', все '+' как '+?' и т.д.., инициализируется из RegExprModifierG
property ModifierM : boolean;
Модификатор /m -воспринимать входной текст как многострочный. Если выключен, то метасимволы `^' и `$' "срабатывают" только в начале и конце входного текста.
Если включен, то эти символы срабатывают также и в начале и в конце каждой строки входного текста., инициализируется из RegExprModifierM
property ModifierX : boolean;
Модификатор /x - ("расширенный синтаксис"), инициализируется из RegExprModifierX


Вообще к этому компоненту справка прилогается на русском языке.
Очень даже неплохая! 

Автор: Berliner 6.5.2006, 17:58
Ок спасиб за ответ, мне бы хотелось например открыть файл найти все строки которые соответствуют данному рег. выражению  и вывести результат например на экран. подскажите плиз с кодом

Код

const expr='[a-c]';

var f:TextFile;

s:string;

begin
OpenDialog1.Execute;
AssignFile(f, OpenDialog1.FileName);
r:=TRegExpr.Create;
Reset(f);

while not EOF(F)
 do
 begin

                r.Expression:=expr;



                end;




 

Автор: Romikgy 10.5.2006, 13:50
Код

const expr='[a-c]';
var f:TStirngList;
i: longint;
begin
f:=TstringList.Create;
f.LoadFromFile(OpenDialog1.FileName);
r:=TRegExpr.Create;

for i:=0 to f.count-1 
 do
 begin
                r.Expression:=f.Strings[i];
 /// здесь запускаешь регесп и віводишь если чет нашло
                end;
f.Free;
end;
 

Автор: Berliner 10.5.2006, 18:08
Спасиб, только я не понял назначение этого места кода.

Код

for i:=0 to f.count-1 
 do
 begin
                r.Expression:=f.Strings[i];
 /// здесь запускаешь регесп и віводишь если чет нашло
                end;



вроде в демо примере примерно так
r.Expression:='[A-Z]';
 и там r.Exec;
растолкуйте плиз 

Автор: Romikgy 11.5.2006, 09:09
Код

r.Expression := expr;
   r.Exec (f.Strings[i]);


ну не смотрел я тогда в примеры, регеспа, не смотрел, думал , что ты и сам можешь это сделать!

Добавлено @ 09:11 
Код

REPEAT
       Result := Result + r.Match [0] + ',';
      UNTIL not r.ExecNext;


в результат складывается ответ, только его обозначить надо 

Автор: Berliner 23.5.2006, 12:46
Спасиб за ответы, вот накидал код но не работает нормально пишет execNext witout exec Pos.
Подправте меня плиз. И сейчас изучаю регулярные выражения.
Код

const expr='[a-c]';

var f:TStringList;
Result:String;
i:integer;

s:string;

begin
OpenDialog1.Execute;
f:=TStringList.Create;
f.LoadFromFile(OpenDialog1.FileName);

r:=TRegExpr.Create;


for i:=0 to f.count-1
 do
 begin
                r.Expression:=expr;
                r.Exec (f.Strings[i]);
                
                end;


            REPEAT
                   Result:=Result + r.Match [0] + ',';
                  UNTIL not r.ExecNext;


f.Free;




 

Автор: Matematik 23.5.2006, 13:08
Код

    if r.Exec(aBuffer) then
      repeat
        {...}
      until not r.ExecNext;
  

Автор: Berliner 23.5.2006, 15:50
Спасиб, за ответ а можно мой код подправить чтобы работал плиз?  

Автор: AriX 23.5.2006, 17:06
Так он в исправленном виде от Математика - рабочий (вместо aBuffer вставляй f.Strings[i]) 

Автор: Berliner 24.5.2006, 10:58
Написал я такой код и выдает ошибку Index out of bounds или что-то подобное.


Код

var f:TStringList;
Result:String;
i:integer;

s:string;

begin
OpenDialog1.Execute;
f:=TStringList.Create;
f.LoadFromFile(OpenDialog1.FileName);

r:=TRegExpr.Create;


for i:=0 to f.count-1
 do
 begin
                r.Expression:=expr;
                r.Exec (f.Strings[i]);
                
                end;


            REPEAT
                   Result:=Result + r.Match [0] + ',';
                  UNTIL not r.ExecNext;
f.Free;



Сто у меня не праильно , сори что побепокоил 

Автор: Matematik 24.5.2006, 11:03
Код

var
  f      : TStringList;    
  Result : String;    
  i      : integer;    
  s      : string;    
begin    
  OpenDialog1.Execute;    
  r := TRegExpr.Create;    
  f := TStringList.Create;    
  f.LoadFromFile(OpenDialog1.FileName);    
  r.Expression := expr;    
  Result := '';
  for i:=0 to f.count-1    do    
  begin    
    if r.Exec(f[i]) then
    REPEAT    
      Result := Result + r.Match[0] + ',';    
    UNTIL not r.ExecNext;
  end;    
  f.Free;
  r.Free;
end;



По идее код должен работать  

Автор: Berliner 2.6.2006, 11:52
Здраствуйте, этот код работает спасиб.
 
Код

var
  f      : TStringList;
  Result : String;
  i      : integer;
  s      : string;
  expr   : string;
begin

  OpenDialog1.Execute;
  r := TRegExpr.Create;
  f := TStringList.Create;
  f.LoadFromFile(OpenDialog1.FileName); 
  expr:='" c<   \: '+Edit1.Text;
  r.Expression := expr;
  Result := '';
  for i:=0 to f.count-1    do
         begin
         if r.Exec(f[i]) then
         REPEAT
         Result := Result + r.Match[0] + ',';
         ShowMessage(Result);
         UNTIL not r.ExecNext;

  end;

  f.Free;
  r.Free;

end;




Но я нахожу например только одну строку в моем случае это имя файла. А мне надо найти и другую информацию(время когда файл упакован, время когда получен отчет) ищу по имени файла которое ввожу в поле  Edit подскажите плиз как это сделать.



Вот текст еоторый я разбираю

Цитата

[ Упаковано  : 10:09:30 ]    --время упаковки файла
 ---------------------------------------
  ФПК    : C:\FOSSMAIL32\QUEUE\ki82bd6c.kad
  Из дир : S:\USAA\IN\
  Ид     : U~20060503100930AAXLH3MKMGEWEYP
  Тема   : Oт USA0 k U0AD
  От     : C:UA/ADMD:PIBFMAIL/PRMD:SUMY/ORG:USA0/OU:USA0/PN:USA0
  Кому   : C:UA/ADMD:PIBFMAIL/PRMD:KIEV/ORG:U0A0/OU:U0AD/PN:U0AD
  Файл   : U0ADUSAA.BPX                       3016      28.04.2006 17:40:06                   --имя файла
  ---------------------------------------

[ Распаковано : 10:09:40 ]
  ---------------------------------------
  ФПК    : A32B235.Fpk     1122   03.05.2006 10:09:38
  В дир  : S:\USAA\OUT\
  Ид     : U~20060503101035AFTXWVF5I2EA3XK
  От     : C:UA/ADMD:PIBFMAIL/PRMD:KIEV/ORG:U0A0/OU:U0T0/PN:U0T0
  Кому   : C:UA/ADMD:PIBFMAIL/PRMD:SUMY/ORG:USA0/OU:USAA/PN:USAA
  Файл   : USAAU0T0.XVU                       674       03.05.2006 10:10:00
  ---------------------------------------
Сформирован отчет

[ Распаковано : 10:09:40 ]
  ---------------------------------------
  ФПК    : 408AC86.Fpk     3231   03.05.2006 10:09:38
  В дир  : S:\USAA\OUT\
  Ид     : U~20060503101031ADTXWVF5I2EA3XK
  От     : C:UA/ADMD:PIBFMAIL/PRMD:KIEV/ORG:U0A0/OU:U0T0/PN:U0T0
  Кому   : C:UA/ADMD:PIBFMAIL/PRMD:SUMY/ORG:USA0/OU:USAA/PN:USAA
  Файл   : USAAU0T0.OBH                       2783      03.05.2006 10:09:58
  ---------------------------------------
Сформирован отчет

[ Распакован отчет  : 10:10:00 ] --время получения отчета
  ---------------------------------------
  ФПК    : 7663927.Fpk     634   03.05.2006 10:09:58
  Ид     : U~20060503100930AAXLH3MKMGEWEYP
  От     : C:UA/ADMD:PIBFMAIL/PRMD:KIEV/ORG:U0A0/OU:U0AD/PN:U0AD
  Кому   : C:UA/ADMD:PIBFMAIL/PRMD:SUMY/ORG:USA0/OU:USA0/PN:USA0
  Файл   : U0ADUSAA.BPX                       3016      28.04.2006 17:40:06    -- имя файла 
  RCODE  : 0
  ERCODE : 0
  ---------------------------------------


  

Автор: Romikgy 7.6.2006, 12:41
Berliner, а как должно в конце выйти? 

Автор: Berliner 7.6.2006, 13:56
Извините непонял
Цитата

как должно в конце выйти?


 

Автор: Yanis 7.6.2006, 14:14
Цитата(Berliner @  7.6.2006,  14:56 Найти цитируемый пост)
Извините непонял

С позволения Romikgy перефразирую, если я правильно понял пост (7.6.2006, 13:41).
Цитата
Ты разбираешь текст. В оригинальном варианте мы его видели, а что должно в конце выйти?
 

Автор: Berliner 8.6.2006, 10:18
я должен найти по имени файла(файл буду вводить в текстовое поле)

1 [ Упаковано  : 10:09:30 ]    


2 [ Распакован отчет  : 10:10:00 ] 

3  От     : C:UA/ADMD:PIBFMAIL/PRMD:KIEV/ORG:U0A0/OU:U0AD/PN:U0AD

4  Кому   : C:UA/ADMD:PIBFMAIL/PRMD:SUMY/ORG:USA0/OU:USA0/PN:USA0

эти данные мне нужно найти, по названию файла, более детальный фрагмент текста выше.

например записать данную инфу в строковые переменные. 

Автор: Romikgy 8.6.2006, 11:37
Код

procedure TForm1.Button1Click(Sender: TObject);
var sl: TStringList;
    i: longint;
begin
Memo1.Clear;
  sl:=TStringList.Create;
  sl.LoadFromFile('d:\regexp.txt');
  try
  if sl.Count<>0 then
  for i:=0 to sl.Count-1 do
  begin
  if (pos('Упаковано',sl[i])>0) then
  Memo1.Lines.Add(sl[i]);
  if (pos('Распаковано',sl[i])>0) then
  Memo1.Lines.Add(sl[i]);
  if (pos('От',sl[i])>0) then
  Memo1.Lines.Add(sl[i]);
  if (pos('Кому',sl[i])>0) then
  Memo1.Lines.Add(sl[i]);

  end;
  finally
  sl.Free;
  end;
end;

так не?  

Автор: Berliner 29.6.2006, 18:27
Спасиб за приведенный код но он ищет не то а мне надо:

я должен найти по имени файла(файл буду вводить в текстовое поле)

1 [ Упаковано  : 10:09:30 ]    


2 [ Распакован отчет  : 10:10:00 ] 

3  От     : C:UA/ADMD:PIBFMAIL/PRMD:KIEV/ORG:U0A0/OU:U0AD/PN:U0AD

4  Кому   : C:UA/ADMD:PIBFMAIL/PRMD:SUMY/ORG:USA0/OU:USA0/PN:USA0

эти данные мне нужно найти, по названию файла, более детальный фрагмент текста выше.

например записать данную инфу в строковые переменные.

Код



  var
  f      : TStringList;
  Result : String;
  i      : integer;
  s      : string;
  expr   : string;
begin
  OpenDialog1.Execute;
  r := TRegExpr.Create;
  f := TStringList.Create;
  f.LoadFromFile(OpenDialog1.FileName); 
  expr:='" c<   \: '+Edit1.Text;
  r.Expression := expr;
  Result := '';
  for i:=0 to f.count-1    do
         begin
         if r.Exec(f[i]) then
         REPEAT
         Result := Result + r.Match[0] + ',';
         ShowMessage(Result);
         UNTIL not r.ExecNext;
  end;
  f.Free;
  r.Free;
end;

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)