Обрезать строку до последней буквы
Как удалить строки до последней буквы в текстовом файле.
Пример текстового файл (все буквы на английском):
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 шт):
данная задача не слишком то отличается от предыдущегов опроса, где вы вставляли **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;
Как вариант:
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);
Условие остановки подразумевает, что нужно извлечь последнюю группу цифр.