Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Расширенные строковые функции

Delphi , Синтаксис , Текст и Строки


 

  Сонник для копьютерщиков. Если вам приснился сон с расширением:
-.ехе,.bаt - он обязательно исполнится;
-.оbj - несвязный сон;
-.htm(l) - к Интернету;
-.jрg - без комментариев;
-.раr - опять чертов будильник не дал досмотреть до конца.

 

  LTrim()     - Удаляем все пробелы в левой части строки
  RTrim()     - Удаляем все пробелы в правой части строки
  Trim()      - Удаляем все пробелы по краям строки
  RightStr()  - Возвращаем правую часть стоки заданной длины
  LeftStr()   - Возвращаем левую часть стоки заданной длины
  MidStr()    - Возвращаем центральную часть строки
  squish()    - возвращает строку со всеми белыми пробелами и с удаленными повторяющимися апострофами.
  before()    - возвращает часть стоки, находящейся перед первой найденной подстроки Find в строке Search. 
	        Если Find не найдена, функция возвращает Search. 
  after()     - возвращает часть строки, находящейся после первой найденной подстроки Find в строке Search. 
                Если Find не найдена, функция возвращает NULL.
  RPos()      - возвращает первый символ последней найденной подстроки Find в строке Search. 
                Если Find не найдена, функция возвращает 0. Подобна реверсированной Pos().
  inside()    - возвращает подстроку, вложенную между парой подстрок Front ... Back.
  leftside()  - возвращает левую часть "отстатка" inside() или Search.
  rightside() - возвращает правую часть "остатка" inside() или Null.
  trim()      - возвращает строку со всеми удаленными по краям белыми пробелами.

 
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.
 
// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 
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) 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;
begin
 
index := 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;
begin
 
index := 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;
begin
 
FindPtr := 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;
begin
 
Index := 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;
begin
 
Index := 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;

Привет! Вот перевод текста на русский язык:

Это модуль Delphi, который предоставляет расширенные функции для строковых операций, таких как trimming, извлечение частей строки и поиск подстрок. Модуль содержит несколько функций:

  1. LTrim, RTrim и Trim - удаляют leading, trailing или оба типа пробелов из строки.
  2. RightStr, LeftStr и MidStr - извлекают правую, левую или центральную часть строки.
  3. Squish - удаляет все пробелы и повторяющиеся апострофы из строки.
  4. Before и After - возвращают часть строки перед или после первого вхождения указанной подстроки.
  5. RPos - возвращает позицию последнего вхождения указанной подстроки в строке.
  6. Inside, LeftSide и RightSide - извлекают подстроки на основе конкретных условий.
  7. Trim (другая функция с тем же именем) - удаляет все пробелы с начала и конца строки.

Модуль хорошо структурирован, с четкими комментариями, объясняющими, что делает каждая функция. Код в основном прямолинейный, но есть некоторые потенциальные проблемы:

  1. В функции RPos, если подстрока не найдена, функция возвращает 0 вместо бросания исключения.
  2. В функциях Inside, LeftSide и RightSide, если указанные подстроки не найдены в исходной строке, функции возвращают пустую строку или null.
  3. Функция Trim не обрабатывает корректно Unicode-пробелы.

Вот предложенный альтернативный вариант реализации для функции RPos:

function RPos(const Find, Search: string): byte;
var
  Index: byte;
begin
  Result := Pos(Find, Search);
  if Result > 0 then
    while StrLComp(Copy(Search, Result - Length(Find) + 1, Length(Find)), Find) = 0 do
      Dec(Result, Length(Find));
end;

Эта реализация использует функцию Pos для поиска первого вхождения подстроки и затем iterates backwards для поиска последнего вхождения.

Для других функций рекомендуется добавить более robust ошибку обработки и поддержку Unicode.

Статья описывает расширенные строковые функции для языка Delphi, включая функции удаления пробелов, нахождения подстрок и работы с ними.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Текст и Строки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-04 05:49:10/0.0057649612426758/1