Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делфи и регулярные выражения, Delphi 6 
:(
    Опции темы
Berliner
Дата 3.5.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Здраствуйте ,возможно ли к Delphi "прикрутить"  регулярные выражения? ЧТо бы работать с ними можно было например как в Java или в Perl? 
PM   Вверх
_hunter
Дата 3.5.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Berliner
Дата 4.5.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Спасиб, А кто нить работал с этой библиотекой? П то у меня не полусется разобрать файл 
PM   Вверх
Alexeis
Дата 4.5.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Berliner, поточнее, что не получается? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Berliner
Дата 4.5.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



 Спасиб. мне бы пример

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

r:=TRegExp.Create;

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

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

Это сообщение отредактировал(а) Berliner - 4.5.2006, 21:08
PM   Вверх
Alexeis
Дата 5.5.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Там в пакете есть неплохие демки 
Вот привожу фрагмент
Код

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


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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Berliner
Дата 6.5.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



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

Код

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;




 
PM   Вверх
Romikgy
Дата 10.5.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

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;
 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Berliner
Дата 10.5.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Спасиб, только я не понял назначение этого места кода.

Код

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



вроде в демо примере примерно так
r.Expression:='[A-Z]';
 и там r.Exec;
растолкуйте плиз 
PM   Вверх
Romikgy
Дата 11.5.2006, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

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


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

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

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


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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Berliner
Дата 23.5.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Спасиб за ответы, вот накидал код но не работает нормально пишет 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;




 
PM   Вверх
Matematik
Дата 23.5.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Код

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

Это сообщение отредактировал(а) Matematik - 23.5.2006, 13:09
PM MAIL WWW ICQ   Вверх
Berliner
Дата 23.5.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Спасиб, за ответ а можно мой код подправить чтобы работал плиз?  
PM   Вверх
AriX
Дата 23.5.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 16.6.2003

Репутация: 5
Всего: 19



Так он в исправленном виде от Математика - рабочий (вместо aBuffer вставляй f.Strings[i]) 
PM MAIL   Вверх
Berliner
Дата 24.5.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Написал я такой код и выдает ошибку 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;



Сто у меня не праильно , сори что побепокоил 
PM   Вверх
Matematik
Дата 24.5.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Код

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;



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

Это сообщение отредактировал(а) Matematik - 24.5.2006, 11:06
PM MAIL WWW ICQ   Вверх
Berliner
Дата 2.6.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Здраствуйте, этот код работает спасиб.
 
Код

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
  ---------------------------------------


  

Это сообщение отредактировал(а) Berliner - 2.6.2006, 11:52
PM   Вверх
Romikgy
Дата 7.6.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Berliner
Дата 7.6.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Извините непонял
Цитата

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


 
PM   Вверх
Yanis
Дата 7.6.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



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

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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Berliner
Дата 8.6.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



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

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

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

например записать данную инфу в строковые переменные. 
PM   Вверх
Romikgy
Дата 8.6.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

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;

так не?  

Это сообщение отредактировал(а) Romikgy - 8.6.2006, 11:38


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Berliner
Дата 29.6.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: нет
Всего: 2



Спасиб за приведенный код но он ищет не то а мне надо:

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

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;

 
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.