Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Поиск и замена по правилу   Найти похожие ветки 

 
Just_   (2004-04-18 20:42) [0]

Здравствуйте!
Помогите пожалуйста новичку: мне надо что бы фукция находила и заменяла в тексте одни символы на те, которые я укажу. Но мне надо что бы в текстовом файле содержались правила по которым будет все это происходить, например:
тест1=1
замена1=1
слово123=1
тест2=2
замена2=2
что-то=3
...
Буду ооочень признателен за помощь!!!


 
8ung ©   (2004-04-18 21:02) [1]

чего-то я с правилами не понял


 
k2 ©   (2004-04-18 21:03) [2]

StringReplace + (текстовый файл=возможно ини-файл)


 
Just_   (2004-04-18 21:10) [3]

> 8ung ©
С правилами имелось ввиду то, что храниться они будут примерно в таком виде как я написал. А значить это будет то, что "тест1" будет заменен на "1" и "замена1" тоже на "1" и т.д.

> k2 ©
Вы хорошо в этом разбираетесь, я только-только начал. StringReplace  пользоваться умею, а вот как сделать что бы все это сочеталось в правилами из текстового файла - не знаю... Хэлп.


 
Юрий Зотов ©   (2004-04-18 21:26) [4]

> Just_   (18.04.04 20:42)

Вот набросок кода, который решает эту задачу. Здесь Source - это TStrings с исходным текстом, а Subst - TStrings с правилами подстановок (точно в том формате, что Вы написали). Переменная IgnoreCase определяет, нужно ли учитывать регистр при замене.

procedure ReplaceAll(Source, Subst: TStrings; IgnoreCase: boolean = False);
var
 S: string;
 F: TReplaceFlags;
 i: integer;
begin
 S := Source.Text;
 F := [rfReplaceAll];
 if IgnoreCase then Include(F, rfIgnoreCase);
 with Subst do
   for i := 0 to Count - 1 do
     S := StringReplace(S, Names[i], Values[Names[i]], F);
 Source.Text := S
end;

Еще см. TStrings.LoadFromFile.


 
Just_   (2004-04-18 22:00) [5]

> Юрий Зотов ©
Огромное спасибо! Я привел программу к такому виду, в соответствии с вашим примером:

procedure TfMain.ReplaceAll(Source: TStrings; IgnoreCase: boolean);
var
 S: string;
 F: TReplaceFlags;
 i: integer;
 Subst: TStrings;
begin
 S := Source.Text;
 F := [rfReplaceAll];
 Subst.LoadFromFile(ExtractFilePath(Application.ExeName) + "rules.txt");
 if IgnoreCase then Include(F, rfIgnoreCase);
   with Subst do
     for i := 0 to Count - 1 do
       S := StringReplace(S, Names[i], Values[Names[i]], F);
   Source.Text := S
end;

procedure TfMain.ToolButton1Click(Sender: TObject);
var
 i : Integer;
begin
 ReplaceAll(mInput.Lines, False);
end;

Она компилируется, но когда начинаю выполнять процедуру выдает ошибку: "Project converter.exe raised exeption class EAccesViolation with message "Acces violation at adress 00403302"..." В чем моя ошибка, подскажите пожалуйста.


 
Юрий Зотов ©   (2004-04-18 22:15) [6]

> Just_  (18.04.04 22:00) [5]

Объекты перед их использованием надо все же создавать? А где создание Subst?

procedure TfMain.ReplaceAll(Source: TStrings; IgnoreCase: boolean);
var
 S: string;
 F: TReplaceFlags;
 i: integer;
begin
 S := Source.Text;
 F := [rfReplaceAll];
 if IgnoreCase then Include(F, rfIgnoreCase);
 with TStrinList.Create do
 try
   LoadFromFile(ExtractFilePath(Application.ExeName) + "rules.txt");
   for i := 0 to Count - 1 do
     S := StringReplace(S, Names[i], Values[Names[i]], F);
 finally
   Free
 end;
 Source.Text := S
end;


 
Just_   (2004-04-18 22:19) [7]

Огромнейшее спасибо Вам, Юрий! Теперь все работает! Еще раз спасибо!!! :)))


 
Just_   (2004-04-18 23:09) [8]

Возник еще вопрос... А как сделать что бы разделителем был другой символ(ы)? Просто "=" оказался неподходящим...


 
Юрий Зотов ©   (2004-04-19 00:46) [9]

Вместо Names и Values надо разбить i-ю строку подстановок на левую и правую часть с помощью Pos и Copy.

N := Pos(Separator, Strings[i]);
OldPattern := Copy(Strings[i], 1, N - 1);
Inc(N, Length(Separator));
NewPattern := Copy(Strings[i], N, Length(Strings[i]) - N + 1);



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
3-1081178285
olhovik
2004-04-05 19:18
2004.05.02
Добавление записи в файл


6-1076015637
DDS
2004-02-06 00:13
2004.05.02
О том как добавить свой пункт в меню IE?


3-1080901680
tv
2004-04-02 14:28
2004.05.02
Литература по InterBase


14-1081733892
Думкин
2004-04-12 05:38
2004.05.02
С днем рождения! 12 апреля.


3-1080925781
Orvat
2004-04-02 21:09
2004.05.02
Понимаю, что не на тот сайт защел, но...