Обрезать строку до последней буквы

Как удалить строки до последней буквы в текстовом файле.

Пример текстового файл (все буквы на английском):

1Zadacha123=gotovo555
2Zadachawer=net543
3adacha123=est32

На выходе получаем:

555
543
32

Как удалить до определенной буквы то понятно вот так:

delete(s,1,pos('Буква',s));

Или

s:=copy(s,1,pos('Буква',s)-1);

Добавлен код:

uses
  Winapi.Windows, Soap.EncdDecd, System.Hash, Winapi.Messages, System.SysUtils,
  System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, RegExpr, FileCtrl, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls,
  Vcl.Buttons, Vcl.StdCtrls,
  Vcl.ExtCtrls, System.IOUtils, System.DateUtils, StrUtils, System.Types,
  System.IniFiles, Vcl.ImgList,
  System.Math, Vcl.Samples.Spin, ShellApi, System.Generics.Collections,
  System.Generics.Defaults,
  System.ImageList;

procedure TForm1.Button2Click(Sender: TObject);
Var
  sl: TstringList;
  i: integer;
Begin
  sl := TstringList.Create();
  sl.loadFromFile('Загрузить.txt');
  for i := 0 to sl.Count - 1 do
  begin
    sl[i] := TRegExpr.replace(sl[i], '.*?(\d+)$', '$1');

  end;
  sl.SaveToFile('Сохранить.txt');
End;

И ошибку выдает в строке

sl[i] := TRegExpr.replace(sl[i], '.*?(\d+)$', '$1') 

при компиляции: Incompatible types: 'Boolean' and 'string'


Ответы (2 шт):

Автор решения: teran

данная задача не слишком то отличается от предыдущегов опроса, где вы вставляли **test** после последней буквы.

Загружаете текстовый файл целиком, например, с помощью TStringList и обрабатываете его построчно. Если файл очень большой то можно использовать другие средства и читать файл построчно, записывая результат в другой файл.

Далее проходитесь по строкам и, используя регулярные выражения, делаете одно следующих вариантов:

  • замена всего что есть в строке, на этим самые цифры
  • вытаскивание последних цифр и замена строки на нее целиком.

В первом случае имеем примерно такой код, используя TRegEx.replace()

sl := TStringList.create();
sl.loadFromFile('D:\qwe.txt');

for i := 0 to sl.Count - 1 do begin
     sl[i] := TRegEx.replace(sl[i], '.*?(\d+)$', '$1');   
    
end;

sl.saveToFile(...);
sl.free()

Во втором - используем TRegEx.match()

m := TRegEx.Match(sl[i], '.*?(\d+)$');
if (m.Success) then begin
    sl[i] := m.Groups[1].Value;
end;
→ Ссылка
Автор решения: MBo

Как вариант:

const
  numb = ['0' .. '9'];
var
   s: string;
   i: Integer;
begin
 s := '1Zadacha123=gotovo555';
 i := length(s);
 while i > 0 do
   if s[i] in numb then
      Dec(i)
   else
      Break;
 s := Copy(s, i + 1, length(s));
 Writeln(s);

Условие остановки подразумевает, что нужно извлечь последнюю группу цифр.

→ Ссылка