Эквивалент Trim$(),Mid$() и др.
Решение 1
unit TrimStr;
{$B-}
{
Файл: TrimStr
Автор: Bob Swart [100434,2072]
Описание: программы для удаления конечных/начальных пробелов
и левых/правых частей строк (аналог Basic-функций).
Версия: 2.0
LTrim() - Удаляем все пробелы в левой части строки
RTrim() - Удаляем все пробелы в правой части строки
Trim() - Удаляем все пробелы по краям строки
RightStr() - Возвращаем правую часть стоки заданной длины
LeftStr() - Возвращаем левую часть стоки заданной длины
MidStr() - Возвращаем центральную часть строки
}
interface
Const
Space = #$20;
function LTrim(Const Str: String): String;
function RTrim(Str: String): String;
function Trim(Str: String): String;
function RightStr(Const Str: String; Size: Word): String;
function LeftStr(Const Str: String; Size: Word): String;
function MidStr(Const Str: String; Size: Word): String;
implementation
function LTrim(Const Str: String): String;
var len: Byte absolute Str;
i: Integer;
begin
i := 1;
while (i <= len) and (Str[i] = Space) do Inc(i);
LTrim := Copy(Str,i,len)
end {LTrim};
function RTrim(Str: String): String;
var len: Byte absolute Str;
begin
while (Str[len] = Space) do Dec(len);
RTrim := Str
end {RTrim};
function Trim(Str: String): String;
begin
Trim := LTrim(RTrim(Str))
end {Trim};
function RightStr(Const Str: String; Size: Word): String;
var len: Byte absolute Str;
begin
if Size > len then Size := len;
RightStr := Copy(Str,len-Size+1,Size)
end {RightStr};
function LeftStr(Const Str: String; Size: Word): String;
begin
LeftStr := Copy(Str,1,Size)
end {LeftStr};
function MidStr(Const Str: String; Size: Word): String;
var len: Byte absolute Str;
begin
if Size > len then Size := len;
MidStr := Copy(Str,((len - Size) div 2)+1,Size)
end {MidStr};
end.
|
Решение 2
Для Mid$ используйте Copy(S: string; start, length: byte): string;
С помощью команды Copy вы также можете осуществить операции Right$ и Left$, выполнив:
Copy(S, 1, Length) для left$ и
Copy(S, Start, 255) для right$
Примечание: Start и Length - байтовые позиции вашего "отправного пункта", вы можете получить их с помощью
Pos().
Вот некоторые написанные мною функции, сослужившие хорошую службу. Сами вы можете начать с модификации функции trim(), например, разработать функции TrimRight$ и TrimLeft$, удаляющие пробелы с правой и левой части строк соответственно. Также вы можете создать функции, работающие как со паскалевскими строками, так и со стороками, заканчивающиеся нулем (терминатором).
const BlackSpace = [#33..#126];
{ squish() возвращает строку со всеми белыми пробелами и с удаленными
повторяющимися апострофами.} function squish(const Search: string): string; var Index: byte;
InString: boolean;
beginInString:=False;
Result:='';
for Index:=1 to Length(Search) do
begin
if InString or (Search[Index] in BlackSpace) then
AppendStr(Result, Search[Index]);
InString:=((Search[Index] = '''') and (Search[Index - 1] <> '\'))
xor InString;
end;
end;{ before() возвращает часть стоки, находящейся перед
первой найденной подстроки Find в строке Search. ЕслиFind не найдена, функция возвращает Search. } function before(const Search, Find: string): string; var index: byte;
beginindex:=Pos(Find, Search);
if index = 0 then
Result:=Search
else
Result:=Copy(Search, 1, index - 1);
end;{ after() возвращает часть строки, находящейся после
первой найденной подстроки Find в строке Search. ЕслиFind не найдена, функция возвращает NULL. } function after(const Search, Find: string): string; var index: byte;
beginindex:=Pos(Find, Search);
if index = 0 then
Result:=''
else
Result:=Copy(Search, index + Length(Find), 255);
end;{ RPos() возвращает первый символ последней найденной
подстроки Find в строке Search. Если Find не найдена,функция возвращает 0. Подобна реверсированной Pos(). } function RPos(const Find, Search: string): byte; var FindPtr, SearchPtr, TempPtr: PChar;
beginFindPtr:=StrAlloc(Length(Find)+1);
SearchPtr:=StrAlloc(Length(Search)+1);
StrPCopy(FindPtr,Find);
StrPCopy(SearchPtr,Search);
Result:=0;
repeat
TempPtr:=StrRScan(SearchPtr, FindPtr^);
if TempPtr <> nil then
if (StrLComp(TempPtr, FindPtr, Length(Find)) = 0) then
begin
Result:=TempPtr - SearchPtr + 1;
TempPtr:=nil;
end
else
TempPtr:=#0;
until TempPtr = nil;
end;{ inside() возвращает подстроку, вложенную между парой
подстрок Front ... Back.} function inside(const Search, Front, Back: string): string; var Index, Len: byte;
beginIndex:=RPos(Front, before(Search, Back));
Len:=Pos(Back, Search);
if (Index > 0) and (Len > 0) then
Result:=Copy(Search, Index + 1, Len - (Index + 1))
else
Result:='';
end;{ leftside() возвращает левую часть "отстатка" inside() или Search.
}function leftside(const Search, Front, Back: string): string; begin Result:=before(Search, Front + inside(Search, Front, Back) + Back);
end;{ rightside() возвращает правую часть "остатка" inside() или Null.
}function rightside(const Search, Front, Back: string): string; begin Result:=after(Search, Front + inside(Search, Front, Back) + Back);
end;{ trim() возвращает строку со всеми удаленными по краям белыми пробелами.
}function trim(const Search: string): string; var Index: byte;
beginIndex:=1;
while (Index <= Length(Search)) and not (Search[Index] in BlackSpace) do
Index:=Index + 1;
Result:=Copy(Search, Index, 255);
Index:=Length(Result);
while (Index > 0) and not (Result[Index] in BlackSpace) do
Index:=Index - 1;
Result:=Copy(Result, 1, Index);
end;
|
[000249]