Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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