На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Функции Split и GetElement
      Расщепление на массив

      Аналог split() из php, расщепляет исходную строку на массив подстрок, основываясь на символах-разделителях
      Например:
      'однажды;в;студёную;зимнюю;пору' -> ['однажды', 'в', 'студёную', 'зимнюю', 'пору']

      ExpandedWrap disabled
        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;


      Применение:
      ExpandedWrap disabled
          arr := Split('однажды;в;студёную;зимнюю;пору');
          arr := Split('name=Ivan|surname=Susanin|birthdate=N/A|gender=M', '|');
          arr := Split('yellow/white//black/red//', '/', False);


      Получение одной подстроки

      Получает подстроку, имеющую указанный индекс (0-based). Пригодится в случае, когда нет нужды в целом массиве. Также можно использовать для выделения подстрок из значений типа "name=value"

      ExpandedWrap disabled
        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;


      Применение:
      ExpandedWrap disabled
          s := GetElement('однажды;в;студёную;зимнюю;пору', 3);
          if GetElement('name=Ivan', 1, '=') = 'Nikanor' then...


      Эта тема была разделена из темы "Функции Split и GetElement"
      Codero ergo sum
      // Программирую — значит, существую
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0714 ]   [ 17 queries used ]   [ Generated: 10.07.20, 10:10 GMT ]