RegExpr: производилась ли подстановка, подсчет замен

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

RegExpr: производилась ли подстановка, подсчет замен

Сообщение Ichthyander »

Нубский вопрос, но тем не менее. Вот есть у меня кусочек кода

Код: Выделить всё

procedure TFileReplacer.FileRelpacerFound(FileIterator: TFileIterator);
var
  AFileName: AnsiString;
begin
  AFileName:=UTF8ToSys(FileIterator.FileName);
  if FileExistsUTF8(AFileName) then
  begin
    FFileText.LoadFromFile(AFileName);
    FRegexObj.Expression := FExprString;
    FFileText.Text:=FRegexObj.Replace(FFileText.Text, FRplcString, False);
    if FRegexObj.SubExprMatchCount>-1 then
    begin
      FFileText.SaveToFile(AFileName);
      if Assigned(FOnFileChanged) then
        FOnFileChanged(Self);
    end;
  end
end;

Процедура собственнно находит текст по регулярному выражению FExprString в тексте файла AFileName и заменяет на новую подстроку FRplcString. Проблема вот в чем. Не правило, что в тексте файла найдется вхождение регулярного выражения и каждый раз сохранять файл не имеет смысл. Кроме того, хотелось бы по колбэек функции делать подсчет замен подстроки (в файле и глобально в программе за время пробега по папкам). Но функция вопреки ожиданию возвращает значение больше -1 в любом случае. Где ошибка, как правильнее не подскажут, кто имел опыт работы с объектами класса TRegExpr?
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Вообщем, решил предварительно делать поиск с помощью процедуры Exec без подстановки, а уже случае возвращаемого значения True запуск процедуры замены

Код: Выделить всё

procedure TFileReplacer.FileRelpacerFound(FileIterator: TFileIterator);
var
  AFileName: AnsiString;
begin
  AFileName:=UTF8ToSys(FileIterator.FileName);
  if FileExistsUTF8(AFileName) then
  begin
    FFileText.LoadFromFile(AFileName);
    FRegexObj.Expression := FExprString;
    if FRegexObj.Exec(FFileText.Text) then
    begin
      FFileText.Text:=FRegexObj.Replace(FFileText.Text, FRplcString, False);
      FFileText.SaveToFile(AFileName);
      Synchronize(@DoFileChangedThread);
    end;
  end
end;
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

Вопрос всплыл по regexpr.
создал простой проект два едита, кнопка и один лабел
Edit1.text хранит маску
edit2.text хранит имя файла
label2.caption хранит результат ОнКлик кнопки

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
   RegExp: TRegExpr;
begin
     RegExp:=TRegExpr.Create;
     regexp.
     Regexp.Expression:=Edit1.Text;
     if regexp.Exec(edit2.Text) then
        label2.Caption:='Подподает...'
     else
        label2.Caption:='Не подподает...';
     regexp.Free;
end;

Растолкуйте почему не срабатывает маска

Код: Выделить всё

^fi.*es\.*$
для файла

Код: Выделить всё

file_names.arj
?
Срабатавет, только если изменить маску добавив после . Но это не правильно. После "es" не должно быть никаких других символов кроме точки и расширения.

Все разобрался!!!!
правильным будет

Код: Выделить всё

^fi.*es\..*$
Ответить