Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
|
Сообщ.
#1
,
|
|
|
Расщепление на массив
Аналог split() из php, расщепляет исходную строку на массив подстрок, основываясь на символах-разделителях Например: 'однажды;в;студёную;зимнюю;пору' -> ['однажды', 'в', 'студёную', 'зимнюю', 'пору'] uses StrUtils; // для PosEx type TStrArray = array of string; // собственный тип, хотя можно пользоваться и стандартным TStringDynArray из Types // Расщепление строки на массив элементов // AllowEmpty - флаг, указывающий, добавлять ли в массив пустые подстроки // если равен False, они будут пропущены function Split(const Str: string; Delim: Char=';'; AllowEmpty: Boolean=True): TStrArray; var CurrDelim, NextDelim, CurrIdx: Integer; begin if Str = '' then begin SetLength(Result, 0); Exit; end; CurrDelim := 1; CurrIdx := 0; SetLength(Result, 16); repeat if CurrIdx = Length(Result) then SetLength(Result, CurrIdx+16); // проверяем наполненность массива и расширяем при необходимости NextDelim := PosEx(Delim, Str, CurrDelim); // позиция следующего разделителя if NextDelim = 0 then NextDelim := Length(Str)+1; // строка кончилась Result[CurrIdx] := Copy(Str, CurrDelim, NextDelim-CurrDelim); CurrDelim := NextDelim+1; // если элемент непуст или же пустые допустимы - увеличиваем индекс if (Result[CurrIdx] <> '') or AllowEmpty then Inc(CurrIdx) else Continue; until CurrDelim > Length(Str); SetLength(Result, CurrIdx); // обрезаем массив end; Применение: arr := Split('однажды;в;студёную;зимнюю;пору'); arr := Split('name=Ivan|surname=Susanin|birthdate=N/A|gender=M', '|'); arr := Split('yellow/white//black/red//', '/', False); Получение одной подстроки Получает подстроку, имеющую указанный индекс (0-based). Пригодится в случае, когда нет нужды в целом массиве. Также можно использовать для выделения подстрок из значений типа "name=value" function GetElement(const Str: string; ElemIdx: Word; Delim: Char=';'): string; var CurrDelim, NextDelim, Idx: Integer; begin Result := ''; CurrDelim := 0; // num раз ищем символ разделителя в строке for Idx := 1 to ElemIdx do begin CurrDelim := PosEx(Delim, Str, CurrDelim+1); if CurrDelim = 0 then Exit; end; Inc(CurrDelim); // теперь здесь индекс первого символа нужного нам элемента NextDelim := PosEx(Delim, Str, CurrDelim); // ищем конечный разделитель if NextDelim = 0 then NextDelim := Length(Str)+1; Result := Copy(Str, CurrDelim, NextDelim-CurrDelim); end; Применение: s := GetElement('однажды;в;студёную;зимнюю;пору', 3); if GetElement('name=Ivan', 1, '=') = 'Nikanor' then... Эта тема была разделена из темы "Функции Split и GetElement" |