Форум: "Основная";
Текущий архив: 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