unit TrimStr;{$B-}{Файл: TrimStrАвтор: Bob Swart [100434,2072]Описание: программы для удаления конечных/начальных пробелови левых/правых частей строк (аналог Basic-функций).Версия: 2.0 LTrim() - Удаляем все пробелы в левой части строкиRTrim() - Удаляем все пробелы в правой части строкиTrim() - Удаляем все пробелы по краям строкиRightStr() - Возвращаем правую часть стоки заданной длиныLeftStr() - Возвращаем левую часть стоки заданной длиныMidStr() - Возвращаем центральную часть строки }interfaceConstSpace = #$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;begini := 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;beginwhile (Str[len] = Space) do Dec(len);RTrim := Strend {RTrim}; function Trim(Str: String): String;beginTrim := LTrim(RTrim(Str))end {Trim}; function RightStr(Const Str: String; Size: Word): String;var len: Byte absolute Str;beginif Size > len then Size := len;RightStr := Copy(Str,len-Size+1,Size)end {RightStr}; function LeftStr(Const Str: String; Size: Word): String;beginLeftStr := Copy(Str,1,Size)end {LeftStr}; function MidStr(Const Str: String; Size: Word): String;var len: Byte absolute Str;beginif 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;begin InString:=False;Result:='';for Index:=1 to Length(Search) dobeginif InString or (Search[Index] in BlackSpace) thenAppendStr(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;begin index:=Pos(Find, Search);if index = 0 thenResult:=SearchelseResult:=Copy(Search, 1, index - 1);end; { after() возвращает часть строки, находящейся послепервой найденной подстроки Find в строке Search. Если Find не найдена, функция возвращает NULL. } function after(const Search, Find: string): string; var index: byte;begin index:=Pos(Find, Search);if index = 0 thenResult:=''elseResult:=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;begin FindPtr:=StrAlloc(Length(Find)+1);SearchPtr:=StrAlloc(Length(Search)+1);StrPCopy(FindPtr,Find);StrPCopy(SearchPtr,Search);Result:=0;repeatTempPtr:=StrRScan(SearchPtr, FindPtr^);if TempPtr <> nil thenif (StrLComp(TempPtr, FindPtr, Length(Find)) = 0) thenbeginResult:=TempPtr - SearchPtr + 1;TempPtr:=nil;endelseTempPtr:=#0;until TempPtr = nil;end; { inside() возвращает подстроку, вложенную между паройподстрок Front ... Back. } function inside(const Search, Front, Back: string): string; var Index, Len: byte;begin Index:=RPos(Front, before(Search, Back));Len:=Pos(Back, Search);if (Index > 0) and (Len > 0) thenResult:=Copy(Search, Index + 1, Len - (Index + 1))elseResult:='';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;begin Index:=1;while (Index <= Length(Search)) and not (Search[Index] in BlackSpace) doIndex:=Index + 1;Result:=Copy(Search, Index, 255);Index:=Length(Result);while (Index > 0) and not (Result[Index] in BlackSpace) doIndex:=Index - 1;Result:=Copy(Result, 1, Index);end; |
[000249]