Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.058 c
14-1081604238
acrona
2004-04-10 17:37
2004.05.02
Работа с другой программой


7-1074852683
Evgeniy_K
2004-01-23 13:11
2004.05.02
Работа с устройствами


1-1081926648
an-na2002
2004-04-14 11:10
2004.05.02
AnsiReplaceText


6-1078908506
_netman_
2004-03-10 11:48
2004.05.02
TCP/IP


1-1081875568
hgd
2004-04-13 20:59
2004.05.02
Hint





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский