GetSubStr

From SunFlurry wiki
Jump to: navigation, search
  GetSubStr (Функции работы со строками)
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число
Визуальность:Нет

Функция получает подстроку исходной строки, начиная с индекса символа, указанного во втором аргументе до следуюшего вхождения строки-разделителя в исходную строку. Индекс обновляется до позиции, непосредственно за найденной строкой-разделителем, если второй аргумент был переменной. Функция может использоваться для разбора строк в различных ситуациях, от форматированного XML или JSON, до прохода по тексту, разделенному знаками переноса строк. Для практического понимания, функция является последовательностью из функций Pos и Mid, работающих на системном уровне.

Функции TearStr и GetSubStr имеют сходное предназначение и используются, как универсальные средства для разбора строк. Однако использование GetSubStr заставляет создавать дополнительную переменную, что усложняет текст программы. Тем не менее, плюсом GetSubStr явлется то, что исходная строка не будет изменена, потенциально, отменяя необходимость дублирования исходной строки в дополнительной переменной, если есть необходимость сохранить ее начальное значение. Выбор той функции, которую выгоднее использовать в определенной ситуации, остается за программистом. Обе функции оптимизированы по скорости исполнения и для работы с большими строками. Ниже дан замер производительности для процессора i5 при сравнительно одинаковых условиях.

Randomize(1);
//Создание длинной строки, разделенной строками _NEWLINE
аСтр:="";
For i:=1 To 1000000 Do
  AppendStringToBufferedString(аСтр,Str(Random(1000000))+_NEWLINE);
EndDo;

//Для текущего алгоритма генерации псевдослучайных чисел, будет выведено 7888988
Message("Длина исходной строки: "+Length(аСтр));
//Аллоцируем все переменные заранее
i:=1;
j:=length(аСтр);


ProfilerClear();
ProfilerStart();
//Используется разбор длинной строки с помощью GetSubStr
While i<=j Do
  Стр2:=GetSubStr(аСтр,i,_NEWLINE);
EndDo;

//Используется разбор длинной строки с помощью TearStr
While аСтр<>"" Do
  Стр2:=TearStr(аСтр,_NEWLINE);
EndDo;
ProfilerStop();
DebugBreak;
Message("Done!");

Замер показывает, что строка Стр2:=TearStr(аСтр,_NEWLINE);, выполнявшаяся 1 млн. раз, заняла время в 2.2 сек, тогда как Стр2:=GetSubStr(бСтр,i,_NEWLINE); потратила 2.589 секунды времени. Это значит, что в данном примере функция GetSubStr выполнялась примерно на 17.7% медленнее.

Синтаксис

GetSubStr(<Строка>,<Индекс (INT)>,<Подстрока-разделитель>="@"):<Результат (STRING)>

Аргументы

  • <Строка> - Значение, над строковым представлением которого необходимо провести операцию.
  • <Индекс (INT)> - (возможен аргумент-переменная (ByRef)) Индекс, с которого начинается поиск подстроки в исходной строке. Начальное значение индекса 1, но принимается и нулевое значение, котрое также будет означать начало текста. После того, как вся строка разобрана, индекс имеет значение длины строки увеличенной на единицу.
  • <Подстрока-разделитель> - (необязательный аргумент) Значение, строковое представление которого используется, как разделитель. Разделитель и его части не будут отдаваться в результате. По умолчанию используется знак at (@).

Возвращаемое значение

Возвращает подстроку, начиная с индекса до найденного разделителя, либо до конца строки, если разделитель не найден. Результат может быть как ANSI строкой, так и UTF-16 строкой в зависимости от типа строки первого аргумента.

Примеры

аСтр:="Производится разбор этой строки";
i:=1;

//Будет выведено "Производится", i имеет значение 14
Message(GetSubStr(аСтр,i," "));

//Будет выведено "разбор", i имеет значение 21
Message(GetSubStr(аСтр,i," "));

//Будет выведено "этой", i имеет значение 26
Message(GetSubStr(аСтр,i," "));

//Будет выведено "строки", i имеет значение 32 (длина строки 31) 
Message(GetSubStr(аСтр,i," "));