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

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

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

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

Сообщение Ichthyander » 07.10.2016 08:32:12

Нубский вопрос, но тем не менее. Вот есть у меня кусочек кода
Код: Выделить всё
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
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение Ichthyander » 08.10.2016 18:55:33

Вообщем, решил предварительно делать поиск с помощью процедуры 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;
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение gvido » 24.10.2016 18:02:20

Вопрос всплыл по 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
Код: Выделить всё
.*
. Но это не правильно. После "es" не должно быть никаких других символов кроме точки и расширения.

Все разобрался!!!!
правильным будет
Код: Выделить всё
^fi.*es\..*$
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru