Difference between revisions of "TearStr"
(Created page with "{{infobox function |name=TearStr |caption=Функции работы со строками |type=1 |status=2 |db=0 |exception=Невозможно превратить в с...") |
m (1 revision imported) |
(No difference)
|
Latest revision as of 07:54, 7 February 2021
TearStr (Функции работы со строками) | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция производит деление исходного строкового представления на две строки, разделенные вторым аргументом, возвращая в результате первую подстроку, и обновляя значение переменной первого аргумента второй строкой, если первый аргумент был переменной. Функция оптимизирована для работы с длинными строками, новое резервирование в памяти строки первого аргумента после выполнения функции не происходит. Функция может использоваться для разбора строк в различных ситуациях, от форматированного XML или JSON, до прохода по тексту, разделенному знаками переноса строк. Для практического понимания, функция является последовательностью из функций Pos, Left и 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% медленнее.
Синтаксис
TearStr(<Строка>,<Подстрока-разделитель>="@"):<Результат (STRING)>
Аргументы
<Строка>
- (возможен аргумент-переменная (ByRef)) Значение, над строковым представлением которого необходимо провести операцию. Обычно аргумент представляет собой переменную со строковым значением. Если аругмент не является переменной, операция будет выполнена, но начальное значение не будет обновлено.<Подстрока-разделитель>
- (необязательный аргумент) Значение, строковое представление которого используется, как разделитель. Разделитель и его части не будут отдаваться в результате. По умолчанию используется знак at (@).
Возвращаемое значение
Возвращает левую часть строки до разделителя, остаток строки после разделителя обновляет значение переменной первого аргумента. Результат может быть как ANSI строкой, так и UTF-16 строкой в зависимости от типа строки первого аргумента.
Примеры
аСтр:="Производится разбор этой строки"; //Будет выведено "Производится", аСтр содержит фразу "разбор этой строки" Message(TearStr(аСтр," ")); //Будет выведено "разбор", аСтр содержит фразу "этой строки" Message(TearStr(аСтр," ")); //Будет выведено "этой", аСтр содержит слово "строки" Message(TearStr(аСтр," ")); //Будет выведено "строки", аСтр содержит пустую строку "" Message(TearStr(аСтр," "));