Главная страница
    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.026 c
3-1081230888
maxz
2004-04-06 09:54
2004.05.02
Не могу в ClientDataSet выставить свойство Active в true


3-1080901697
Skulll
2004-04-02 14:28
2004.05.02
Веб клиент на PHP, ASP, JSP или CGI


3-1081324066
Julia_
2004-04-07 11:47
2004.05.02
Table has meny users


4-1078199427
Lefan
2004-03-02 06:50
2004.05.02
Взять HTML из чужого приложения...


1-1081941918
Cr@zy-EyE
2004-04-14 15:25
2004.05.02
Создаю объект в initialization, а в юните его не видно





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский