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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения - нужна помощь, разъясните ламеру 
:(
    Опции темы
NibiluK
Дата 24.7.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно написать прогу-поисковик. То есть даю программе текст, а она должна в нём что-либо находить.
вот собственно сами регулярные выражения:
. (точка) - любой (но только один символ);
^- начало строки (например: А2 соответствует любой строке, в начале которой стоит
символ 2);
$ - конец строки (например: 1$ соответствует любой строке, в конце которой находится if);
* - нуль или несколько повторений предыдущего символа или точки.
Символы ^ и $ внутри регулярного выражения не считаются метасимволами.
Подскажите пожалуйста, как это дело реализовать 
PM MAIL   Вверх
_hunter
Дата 24.7.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



взять готовое решение (TRegExp) и преобразовать ввоимую строку в оответствии с его синтаксисом 


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


Новичок



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

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



Как искать текст (конкретное буквосочетание) я разобрался, а как быть с использованием метасимволов? 
PM MAIL   Вверх
NibiluK
Дата 27.7.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Из примера-исходника выдрал код:

Код

unit TRegExprRoutinesMain2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TfmTRegExprRoutines = class(TForm)
    grpReplace: TGroupBox;
    lblSearchIn: TLabel;
    memSearchIn: TMemo;
    lblReplaceWith: TLabel;
    btnReplace: TBitBtn;
    edReplaceWith: TEdit;
    lblSearchFor: TLabel;
    edSearchFor: TEdit;
    memReplaceRes: TMemo;


    procedure btnReplaceClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmTRegExprRoutines: TfmTRegExprRoutines;

implementation

uses RegExpr;

{$R *.DFM}


procedure TfmTRegExprRoutines.btnReplaceClick(Sender: TObject);
 begin
  memReplaceRes.Text := ReplaceRegExpr (edSearchFor.Text, memSearchIn.Text, edReplaceWith.Text);
 end;

end.


Он, как видите, заменяет слова. Хочу чтобы он найденые слова просто выделял.... 
PM MAIL   Вверх
ASGDeveloper
Дата 30.7.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Цитата(NibiluK @  24.7.2006,  11:51 Найти цитируемый пост)
Нужно написать прогу-поисковик. То есть даю программе текст, а она должна в нём что-либо находить.

Хм, а модуль Masks не подойдет? 
PM MAIL   Вверх
creas0ft
Дата 5.8.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм... А если расширить вопрос.
Есть текст шаблон.
В нем заданы некие предустановленные теги {k1} {k2} {k3}
и у тегов могут быть параметры {k5 param=value}
Какие есть уже готовые модули для такого?!
--------------------
Форум программистов уклонистов в сторону сео-шмео
PM MAIL WWW ICQ   Вверх
Yanis
Дата 8.8.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



creas0ft
Эту задачу тоже можно решить с помощью TRegExpr. Советую скачать компонент и прочитать справку по нему.


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


Новичок



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

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



Можно ли заставить этот код искать с помощью компонента TRegExp?

Код


procedure TForm1.FindDialog1Find(Sender: TObject);

var
 Buff,P,FT: PChar;
 BuffLen: Word;
begin
 with Sender as TFindDialog do
  begin
   GetMem(FT, Length(FindText) + 1);
   StrPCopy(FT, FindText);
   BuffLen:= Memo1.GetTextLen + 1;
   GetMem(Buff, BuffLen);
   Memo1.GetTextBuf(Buff, BuffLen);
   P:= Buff + Memo1.SelStart + Memo1.SelLength;
   P:= StrPos(P, FT);
   if P=nil then MessageBeep(0)
   else
    begin
     Memo1.SelStart:= P - Buff;
     Memo1.SelLength:= Length(FindText);
    end;
   FreeMem(FT, Length(FindText) + 1);
   FreeMem(Buff, BuffLen);
  end;
end;

PM MAIL   Вверх
Alexeis
Дата 20.9.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Так этот код и так уже что-то ищет. Что конкретно нужно искать и по какому шаблону?


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

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

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


Новичок



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

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



В том то и дело, что мне нужно искать каждый раз по разному шаблону, то есть он должне вводиться извне. Всё, чего я смог добиться при использовании TRegExprоиск по жёстко заданному шаблону, что мне не подходит. Искать нужно слова. Найденное слово должно оттеняться. При этом нужно чтобы код реагировал на метасимволы, вводимые в строке поиска.

Это сообщение отредактировал(а) NibiluK - 20.9.2006, 16:54
PM MAIL   Вверх
Elfebet
Дата 20.9.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



Цитата

В том то и дело, что мне нужно искать каждый раз по разному шаблону

так не бывает... ну ты ведь для себя какой-то стандарт придумал? или хотя бы пример покажи как оно должно работать?


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
NibiluK
Дата 20.9.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот смотри, например у меня есть какой-то текст. В нём надо найти, скажем, все слова, начинающиеся на 'wh'. А потом, например, слова, заканчивающиеся на "е". В задании указывается что при этом обязательно должны использоваться метасимволы. Обычный поисковик не подходит поэтому, т.к. он эти метасимволы не воспринимает.
PM MAIL   Вверх
Alexeis
Дата 20.9.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(NibiluK @  20.9.2006,  16:53 Найти цитируемый пост)
При этом нужно чтобы код реагировал на метасимволы, вводимые в строке поиска.

Так их просто заэкранировать нужно и все.

Цитата(Elfebet @  20.9.2006,  16:57 Найти цитируемый пост)
так не бывает... ну ты ведь для себя какой-то стандарт придумал?

Это еще почему, задал новое выражение и вот новый поиск... 


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

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

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



Цитата

Это еще почему, задал новое выражение и вот новый поиск...  

я имел ввиду что правила поиска везде присутствует, ну типа хочеш найти все слова на чинающие на букву а - а*, хочеш найти слова заканчивающие на у - *у, хошеч найти слово "превед" (но не помниш как пишется чере и или через е) - пр_в_д. вот что я имел ввиду...


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
NibiluK
Дата 20.9.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(alexeis1 @  20.9.2006,  17:08 Найти цитируемый пост)
Так их просто заэкранировать нужно и все.

А это как, можно поподробнее?
PM MAIL   Вверх
Alexeis
Дата 20.9.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Экранирует обратный слэш  "\" записанный перед метасимволом.


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

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

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


Новичок



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

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



Цитата(alexeis1 @  20.9.2006,  17:43 Найти цитируемый пост)
Экранирует обратный слэш  "\" записанный перед метасимволом. 

Не получается....
PM MAIL   Вверх
Alexeis
Дата 20.9.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Можно глянуть на то выражение, которое не получается. Я специально проверял перед тем как писать.


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

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

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


Новичок



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

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



Например: "^\Z"
PM MAIL   Вверх
Alexeis
Дата 20.9.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Так Z это же обычный символ.
Вот можно проробовать на таком тексте
Цитата

gaeraent
wae
arw
aentm weat
wae
tnweatZnwea
t
nwetwZa\etwe
tnw
etwaentwaet


и регулярное выражение "\\" (первый слэш экранирует второй)
тогда как "\" - вызовет ошибку. 


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

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

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


Новичок



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

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



на запрос "\\", как в одиночу так и с метасимволами, ничего не находится. Этот код, который я привёл, ищет точное соответствие. Так что, никак регэкспы в него не впихнуть?
PM MAIL   Вверх
Alexeis
Дата 21.9.2006, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(NibiluK @  20.9.2006,  21:21 Найти цитируемый пост)
на запрос "\\", как в одиночу так и с метасимволами, ничего не находится
 Значит, что-то в коде не верно, этот вариант я проверял.


Цитата(NibiluK @  20.9.2006,  20:44 Найти цитируемый пост)
 "^\Z" 
 если нужно найти выражение в точноти соответствющее указаной записи, то для получения правильного регулярного выражения экранируя символы получим "\^\\Z".



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

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

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


Шустрый
*


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

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



А кто нить видел русскую документацию по RegExpr, а то с английским траблы.
PM MAIL   Вверх
Alexeis
Дата 21.9.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



У меня есть. Там в комплекте шла русская и болгарская.


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

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

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


Новичок



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

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



Цитата(alexeis1 @  21.9.2006,  01:27 Найти цитируемый пост)
 Значит, что-то в коде не верно, этот вариант я проверял.

А на чём проверял-то?
Цитата(alexeis1 @  21.9.2006,  01:27 Найти цитируемый пост)
если нужно найти выражение в точноти соответствющее 

С поиском в точности такого выражения проблем нет - нужно искать слова и строки, начинающиеся чем-то и кончающиеся чем-то.

Добавлено @ 06:18 
Ладно, если уж с тем кодом ничего нельзя сделать путного, то тогда попробуем покурочить демо-программку к TRegExpr
Код
unit TRegExprClassMain;

{

  Демо-пример использования TRegExpr

  Использование класса TRegExpr, т.е. самый правильный
  способ использования.

}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;

type
  TfmTRegExprClassMain = class(TForm)
    btnExtractEmails: TBitBtn;
    memExtractEmails: TMemo;
    lbxEMailesExtracted: TListBox;
    lblSearchPhoneIn: TLabel;
    memSearchPhoneIn: TMemo;
    Bevel1: TBevel;
    lblSubstituteTemplate: TLabel;
    memSubstituteTemplate: TMemo;
    btnSubstitutePhone: TBitBtn;
    memSubstitutePhoneRes: TMemo;
    procedure btnExtractEmailsClick(Sender: TObject);
    procedure btnSubstitutePhoneClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmTRegExprClassMain: TfmTRegExprClassMain;

implementation

uses RegExpr;
{$R *.DFM}

// Эта простенькая функция извлечет все e-mail адреса из входной строки
// и поместит их в результирующую строку в формате CSV (comma separated values)
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;
  // Создание объекта - не забывайте об этом, 10% писем ко мне
  // связаны с тем, что объект начинают использьвать, не создав его.

  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;

procedure TfmTRegExprClassMain.btnExtractEmailsClick(Sender: TObject);
 begin
  lbxEMailesExtracted.Items.CommaText := ExtractEmails (memExtractEmails.Text);
 end;

// В этом примере мы извлечем телефонный номер из входной строки,
// разделим его на составляющие (код страны, код города, внутренний номер телефона).
// Затем подставим все это в шаблон.
function ParsePhone (const AInputString, ATemplate : string) : string;
 const
  IntPhoneRE = '(\+\d *)?(\(\d+\) *)?\d+(-\d*)*';
 var
  r : TRegExpr;
 begin
  r := TRegExpr.Create; 
  // Создание объекта - не забывайте об этом, 10% писем ко мне
  // связаны с тем, что объект начинают использьвать, не создав его.

  try // гарантирует освобождение занятой объектом памяти
     r.Expression := IntPhoneRE;
    // Присваиваем исходный текст регулярного выражения.
    // При первой же необходимости (например, при вызове метода Exec)
    // оно будет откомпилировано. Если в выражении есть ошибки, то 
    // будет вызвано исключение
     if r.Exec (AInputString)
      then Result := r.Substitute (ATemplate)
      else Result := '';
    finally r.Free;
   end;
 end;

procedure TfmTRegExprClassMain.btnSubstitutePhoneClick(Sender: TObject);
 begin
  memSubstitutePhoneRes.Text := ParsePhone (memSearchPhoneIn.Text, memSubstituteTemplate.Text);
 end;

end.


Нужно чтобы вот это 
Код
EmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';
 можно было менять из отдельного поля Edit или Memo
PM MAIL   Вверх
Alexeis
Дата 22.9.2006, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(NibiluK @  22.9.2006,  06:03 Найти цитируемый пост)
Нужно чтобы вот это 
Выделить всёкод Pascal/Delphi
1: EmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';
 можно было менять из отдельного поля Edit или Memo 


без проблем,  вместо
r.Expression := EmailRE;

написать

r.Expression := Edit1.text;


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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (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.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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