StrUtils в Delphi

Нужно мнение по SplitString

09.12.2015, 17:55

Нужно мнение
Здравствуйте. Core i3-2350M 2.3ГГц GeForce GT630M 1ГБ Оперативная память (RAM) 4 ГБ Пойдут ли.

Нужно Ваше мнение
Доброе утро. С недавнего времени решил заняться написанием сайта. В СЕО я полный НУБ. ЧИТАЮ.

Нужно ваше мнение..
Всем добрый вечер. Появилась на днях следующая проблема. У меня перестали индексировать сайт.

Нужно ваше мнение
Здравствуйте! Оцените, пожалуйста, дизайн и функциональность сайта — бесплатная система для.

Нужно мнение профессионалов
Вот у меня такой вопрос реально сделать (вот есть два компа баз локальной сети! на обоих работает.

09.12.2015, 18:59 2

Решение

shtyker, проверил у себя на XE3, подключив модуль StrUtils — функция SplitString у меня доступна.
У Вас Delphi7? Попробуйте альтернативную функцию ExtractStrings.

Или еще можно так разбить текст с разделителем

Канал в Telegram

Вы здесь

PosEx (функция)

procedure TForm1.Button1Click(Sender: TObject);
const str= ‘Эта_веселая_жизнь!’ ;
var sMsg:string;
sPos:integer; //начальная позиция
begin
sPos:=1;
sMsg:= » ; //интересное наблюдение. Без этой строки антивирус Dr.Web ругался на якобы вирус :)
repeat
sPos:=PosEx( ‘_’ ,str,sPos);
if sPos<>0 then
begin
sMsg:=sMsg + inttostr(sPos)+ ‘, ‘ ; //заносим найденные позиции
inc(sPos); //смещаем позицию просмотра на +1. Функция inc аналогична записи sPos:=sPos+1
end;
until sPos=0; //вертим цикл пока sPos не станет равным 0

//формируем сообщение
if length(sMsg)=0 then //если длина строки нулевая, то значит ничего не нашли
sMsg:= ‘Символа «_» в строке [‘ +str+ ‘] нет!’
else
begin
//удаляем из строки sMsg два последних символа «, «
//побочный эффект перечисления
delete(sMsg,length(sMsg)-1,2);
sMsg:= ‘Символ «_» в строке [‘ +str+ ‘] встречается на следующих позициях: ‘ +sMsg;
end;

Глубины Synapse или дополнительные возможности библиотеки.

Что мы на сегодняшний день знаем из постов блога WebDelphi про Synapse? Основной материал крутится вокруг модуля HTTPSend и, соответственно, объекта THTTPSend – как скачать данные с ProgressBar’ом, как обработать события сокета, как работать с https и т.д. Была пара публикация про TSMTPSend и отправку писем через Gmail…и пожалуй все. Ну оно (по-крайней мере для меня) вполне объяснимо – пишу про то, что в данный конкретный момент меня интересует, ну или очень сильно интересует кого-либо из читателей.

Сегодня я хотел бы затронуть в статье ещё один модуль Synapse, который хотите того Вы или нет обязательно задействуется в работе библиотеки и, который иногда может послужить для Вас очень неплохим подспорьем в работе с веб-сервисами в Delphi – сэкономить время на поиск в Сети, да и просто немного сократить объем Вашей программы.

Речь сегодня пойдет о модуле SynaUtil библиотеки Synapse.

Как, может быть, понятно из названия, SynaUtil – это модуль содержащий вспомогательные методы для работы с библиотекой. Однако методы, представленные в этом модуле могут быть эффективно использованы и в других случаях.

Например, все мы в курсе про стандартный модуль StrUtils в Delphi (кто не в курсе – живо смотрите. что он из себя представляет) – модуль без сомнения полезный, позволяет более удобно организовать работу со строками, есть функции типа ReverseString и т.д., что избавляет нас лишний раз гуглить на темы “Как перевернуть строку?” или “Как заменить текст?” и т.д.Однако SynaUtil добавляет ещё ряд довольно полезных методов для работы со строками, например следующие:

Это далеко не весь перечень функций работы со строками. Есть методы для вытягиваия из строки email-адресов, разборов URL, поиск положения какой-либо подстроки слева или справа от заданного символа и т.д. Функций для работы со строками масса. Конечно не все они являются чем-то новым и неизученным, но тем не менее использование их в своей программе, которая использует Synapse позволит Вам лишний раз не отвлекаться на поиск решений в Интернете — всё уже есть под рукой.

Теперь движемся далее. Вы в курсе про модуль DateUtils? Уверен, что большинство моих читателей знают этот модуль вдоль и поперек, а часть как минимум знает о его существовании в глубинах Delphi. Кто не знает про DateUtils – советую, опять же, открыть и посмотреть на внутренности модуля. Полезная вещь, когда речь заходит о работе с TDateTime и временем вообще. Но и здесь не все предусмотрено (разработчики – они ж не Всемогущие), например, не предусмотрена работа с датой/временем записанными согласно разным RFC. И тут Вам на помощь снова может прийти модуль Synapse SynaUtil. Что у него есть для работы с датами:

Особенно полезна для работы с различными API последняя функция — DecodeRfcDateTime.

Есть в этом модуле также и ряд других менее важных, но, тем не менее, полезных методов, например:

В общем, при работе с Synapse никогда не стоит забывать про этот замечательный модуль SynaUtil. Экономьте свое время и силы, т.к. множество рутинных операций для которых нет методов в «штатных» модулях Delphi можно решить с использованием методом из вспомогательного модуля Synapse:)

delphi — StrUtils.SplitString не работает должным образом

Я использую StrUtils для разделения строки на TStringDynArray , но результат не был таким ожидаемым. Я попытаюсь объяснить проблему:

У меня есть строка str : a; b; c
Теперь я вызвал StrUtils.SplitString(str, ; ); , чтобы разбить строку, и я ожидал массив с тремя элементами: a , b , c

Но у меня есть массив с пятью элементами: a , , b , , c .
Когда я разделяю только ; вместо ; , я получаю три элемента с ведущим пустым.

Итак, почему я получаю пустые строки в своем первом решении?

    9 3
  • 19 май 2020 2020-05-19 17:43:34
  • Obl Tobl

3 ответа

Это потому, что второй параметр SplitString — это список одиночных разделителей символов, поэтому ; означает разделение на; ИЛИ разделить на . Итак, строка разбивается на каждый ; и в каждом пространстве, и между ; и «нет», следовательно, пустые строки.

  • 19 май 2020 2020-05-19 17:43:35
  • Dsm

SplitString определяется как

Можно было бы подумать, что Delimiters обозначает одиночную строку разделителя, используемую для разделения строки, но на самом деле обозначает набор одиночных символов, используемых для разделения строки. Каждый символ в строке Delimiters будет использоваться как один из возможных разделителей.

Разделение строки на разные части, разделенные указанными разделитель символов. SplitString разбивает строку на разные части помеченные указанным разделителем символами. S — строка, которая должна быть Трещина. Разделители — это строка, содержащая символы , определенные как разделители.

  • 19 май 2020 2020-05-19 17:43:35
  • Dalija Prasnikar

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

Что бы вы ожидали вернуться SplitString(foo,,bar, ,) ? Будете ли вы искать (foo, bar) или ответ должен быть (foo, , bar) ? Это не ясно, априорно, что правильно, и разные варианты использования могут потребовать другой вывод.

Если в вашем случае указаны два разделителя, ; и . Это означает, что

делится на ; и снова на . Между этими двумя разделителями нет ничего, и, следовательно, пустая строка возвращается между a и b .

Метод Split из символа строки, представленный в XE3, имеет TStringSplitOptions . Если вы передаете ExcludeEmpty для этого параметра, то последовательные разделители рассматриваются как один разделитель. Эта программа:

Но у вас нет этого для вас в XE2, поэтому я думаю, вам придется сворачивать свою собственную функцию split. Что может выглядеть так:

Конечно, все это предполагает, что вы хотите, чтобы пространство выступало в качестве разделителя. Вы просили об этом в коде, но, возможно, вы действительно хотите, чтобы только ; выступал в качестве разделителя. В этом случае вы, вероятно, захотите передать ; в качестве разделителя и обрезать возвращаемые строки.

Дополнительные функции для работы со строками — модуль StrUtils

Дополнительный модуль StrUtils.pas содержит дополнительные функции для работы со строками. Среди этих функций множество полезных. Вот краткое описание часто используемых функций:

PosEx(подстрока, строка, отступ) — функция, аналогичная функции Pos(), но выполняющая поиск с указанной позиции (т.е. с отступом от начала строки). К примеру, если вы хотите найти в строке второй пробел, а не первый, без этой функции вам не обойтись. Чтобы сделать поиск второго пробела вручную, нужно предварительно вырезать часть из исходной строки.

AnsiReplaceStr, AnsiReplaceText(строка, текст_1, текст_2) — функции выполняют замену в строке строка строки текст_1 на текст_2. Функции отличаются только тем, что первая ведёт замену с учётом регистра символов, а вторая — без него.

В нашей программе можно использовать эти функции для вырезания из строки символов #13 и #10 — для этого в качестве текста для замены следует указать пустую строку. Вот решение в одну строку кода:

Text:=AnsiReplaceText(AnsiReplaceText(Text,Chr(13),»),Chr(10),»);

DupeString(строка, число_повторений) — формирует строку, состоящую из строки строка путём повторения её заданное количество раз.

Илон Маск рекомендует:  Работа с форматом rtf в delphi

ReverseString(строка) — инвертирует строку («123» -> «321»).

Также следует упомянуть у функциях преобразования регистра.

UpperCase(строка) — преобразует строку в верхний регистр; LowerCase(строка) — преобразует строку в нижний регистр.

Для преобразования отдельных символов следует использовать эти же функции.

Подробную информацию о каждой функции можно получить, введя её название в любом месте редактора кода, установив курсор на это название (или выделив его) и нажав F1.

Скриншоты программ, описанных в статье

Программа извлечения слов из текста Таблица символов

Заключение

Длинный получился урок. Итак, сегодня мы познакомились со строками и символами и научились с ними работать. Изученные приёмы используются практически повсеместно. Не бойтесь экспериментировать — самостоятельно повышайте свой уровень навыков программирования!

StrUtils в Delphi

Выпуск № 739
от 17.02.2007, 12:35

Администратор: Калашников О.А.
В рассылке: Подписчиков: 440, Экспертов: 78
В номере: Вопросов: 5, Ответов: 11

Вопрос № 75206: Здравствуйте, уважаемые эксперты! Подскажите как в TMEMO отменить перенос строки. То есть чтобы всё писалось в одну строчку. Зарание спасибо. Вопрос № 75244: Здравствуйте! Посоветуйте статью про работу со строками. Использую Turbo Delphi 2006. Наверняка есть какие-то удобные функции. К примеру как разобрать строку вида дд.мм.гггг? Нужно проверить на то, верно ли введена дата. Извращаться с копиров. Вопрос № 75258: Почему привидённый ниже пример не работает. В программне переменной oper2 я присваиваю значение 0 а переменной oper1 1 для примера а программа все равно вываливается с ошибкой. Вопрос № 75304: Подскажите какие-нибудь книги для программирования типа клиент-сервер. Вопрос № 75354: Здраствуйте! Подскажите пожалуйста можно ли такое сделать одним запросом и если да то как? В таблице четыре столбца Уник_Индификатор_Металла,Метал,Было,Пришло,Ушло,Осталось. Что бы в «Было» соответствующего металла записывала.

Вопрос № 75.206
Здравствуйте, уважаемые эксперты!
Подскажите как в TMEMO отменить перенос строки. То есть чтобы всё писалось в одну строчку.
Зарание спасибо.
Отправлен: 11.02.2007, 14:04
Вопрос задал: Артём1983 (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 7)
Отвечает: Ерёмин Андрей
Здравствуйте, Артём1983!
Свойство WantReturns отвечает за то, разрешено ли переходить на новую строку при вводе текста. Установите это свойство в False и нажатием Enter на новую строку перейти будет нельзя. Чтобы совсем запретить этот переход, добавьте обработчик события OnChange:
procedure TForm1.Memo1Change(Sender: TObject);
Var CP: Integer;
begin
CP:=Memo1.SelStart;
Memo1.Text:=AnsiReplaceText(Memo1.Text,Chr(13)+Chr(10),»);
Memo1.SelStart:=CP;
end;

В uses нужно подключить модуль StrUtils. Желаю удачи!
———
Нет правила без исключений. Правило без исключений — исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Всё для программиста. Файловый архив, статьи, помощь, советы, обмен опытом.
ICQ: 286867644
—-
Ответ отправлен: 11.02.2007, 14:16
Отвечает: Базанов Иван Александрович
Здравствуйте, Артём1983!
Установи свойство WordWrap в false. Это предотвратит разбиение на строки, но только если ты сам не вводишь переводы строка.
Чтобы запретить и это (если вдруг нужно) Установи свойство WantReturns в false. Правда тогда поведение Memo не будет отличаться от TEdit
———
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 4-ый класс)
Ответ отправлен: 11.02.2007, 15:44
Отвечает: W@NDeReR
Здравствуйте, Артём1983!
Установить свойство ScrollBar в значение ssHorizontal появиться горизонтальная полоса прокрутки и текст будет писаться в строку.
Ответ отправил: W@NDeReR (статус: 2-ой класс)
Ответ отправлен: 11.02.2007, 19:31
Вопрос № 75.244
Здравствуйте!
Посоветуйте статью про работу со строками. Использую Turbo Delphi 2006. Наверняка есть какие-то удобные функции.
К примеру как разобрать строку вида дд.мм.гггг? Нужно проверить на то, верно ли введена дата. Извращаться с копированием каждой части не хочется.
Как проверить содержит-ли строка только цифры?
Есть-ли что-то вроде sprintf наоборот? Чтобы разделять строку на подстроки?
На PHP так удобно всё это решается, а тут начал делать и встал на месте.
Отправлен: 11.02.2007, 18:40
Вопрос задал: Yadovit (статус: 3-ий класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: )
Отвечает: sir henry
Здравствуйте, Yadovit!
Хотя функций для работы со строками в Дельфи довольно много, но они только общего характера, такой же как и сам язык дельфи. Например объединение строк, поиск подстроки, убрать пробелы, конвертирование из строки в другие типы данных и наоборот. В инете, соответственно, есть статьи по работе со строками только как часть какого-то другого материала. Конкретно посвященных строкам, кроме как простого списка функций, такого нет.
Могу посоветовать книгу Фаронов «Дельфи. Учебный курс». Там есть несколько разделов посвященных строкам. Однако не ждите, что Вы получите где-либо потрясающие откровения по работе со строками. :)
В Вашем случае с датой, можно ее правильность проверить преобразовав строку с датой в тип даты:
StrToDate(‘дд.мм.гггг’)
в случае если в строке даты содержится ошибка, то при преобразовании будет выдано исключение, поэтому строку преобразования нужно заключить в Try .. Exept.
Можно выбрать подстроку из строки с помощью функций:
AnsiLeftStr(), AnsiMidStr(), AnsiRightStr() — выделение левой, средней, правой части строки.
Прочитайте хелп по модулю StrUtils.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
—-
Ответ отправлен: 11.02.2007, 19:36
Оценка за ответ: 5
Отвечает: Rusland
Здравствуйте, Yadovit!
Рекомендую использовать регулярные выражения. Есть компонент TRegExpr — основан на регулярных выражениях Perl (в PHP аналогично). Он решит все проблемы со строками. Официальный сайт http://www.regexpstudio.com/RU/TRegExpr/TRegExpr.html (в поставку входят Demo-примеры)
Ответ отправил: Rusland (статус: Профессионал)
Россия, Казань
Адрес: Мой адрес не дом и не улица, мой адрес советский союз
WWW: Логотипы для сотовых телефонов
—-
Ответ отправлен: 12.02.2007, 11:45
Оценка за ответ: 5
Отвечает: Синельников Сергей
Здравствуйте, Yadovit!

Остается добавить, что сконвертировать строку в дату, одновременно проверяя на корректность, можно и не вызывая исключений. Есть функция

function TryStrToDate(const S: string; out Value: TDateTime): Boolean;

в случае правильной даты возвращает True, а дату в параметре Value.

Ответ отправил: Синельников Сергей (статус: 3-ий класс)
Ответ отправлен: 13.02.2007, 07:35
Оценка за ответ: 5
Вопрос № 75.258
Почему привидённый ниже пример не работает. В программне переменной oper2 я присваиваю значение 0 а переменной oper1 1 для примера а программа все равно вываливается с ошибкой

Приложение:

Отправлен: 11.02.2007, 20:06
Вопрос задал: Артём1983 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)
Отвечает: monah
Здравствуйте, Артём1983!
Дело в том, что по умолчанию Делфи перехватывает исключительные ситуации.
Зайдите в меню «Tools/Debugger Options». Вкладка Language Exception. Снимите флажек Stop on Delphi Exception.
———
festina lente
Ответ отправил: monah (статус: Студент)
Ответ отправлен: 11.02.2007, 20:13
Оценка за ответ: 5
Комментарий оценки:
В форуме я уже говорил. Бальшое пасибо. Да и ещё раз скажу Большое спасибо. Очень быстрый ответ.
Отвечает: Химяк Виктор Васильевич
Здравствуйте, Артём1983!
ShowMessage(‘e’); Убери первую .
Ответ отправил: Химяк Виктор Васильевич (статус: 3-ий класс)
Ответ отправлен: 11.02.2007, 22:27
Оценка за ответ: 3
Комментарий оценки:
У меня в делфи всё было нормально я имею в виду showmeeage просто когда вставил код в форму то ещё появились а убирать я их не стал.
Вопрос № 75.304
Подскажите какие-нибудь книги для программирования типа клиент-сервер.
Отправлен: 12.02.2007, 02:18
Вопрос задал: Костенко Игорь Викторович (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: )
Отвечает: Химяк Виктор Васильевич
Здравствуйте, Костенко Игорь Викторович!
Вы не указали для какого сервера.
Для InterBase, FireBird, Yaffil — «Мир InterBase»,
Сайт этой книги, там же маса полезных статей и т.д.
http://www.interbase-world.com/ru/
Ответ отправил: Химяк Виктор Васильевич (статус: 3-ий класс)
Ответ отправлен: 12.02.2007, 19:27
Оценка за ответ: 5
Вопрос № 75.354
Здраствуйте!
Подскажите пожалуйста можно ли такое сделать одним запросом и если да то как?
В таблице четыре столбца Уник_Индификатор_Металла,Метал,Было,Пришло,Ушло,Осталось.
Что бы в «Было» соответствующего металла записывалась сумма «Пришло+Осталось» этого же маталла.
Отправлен: 12.02.2007, 11:54
Вопрос задал: chikanok (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Архангельский Андрей Германович
Здравствуйте, chikanok!

Если по всем то:
Update Table Set Было=Пришло+Осталось

ЕСли по конкретному то:
Update Table Set Было=Пришло+Осталось
where Уник_Индификатор_Метала=.
———
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО

Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 12.02.2007, 12:03
Оценка за ответ: 5
Отвечает: Igor_
Здравствуйте, chikanok!

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

Но, в общем, конечно, вопрос состоял не в этом..
Ответ на вопрос:

Это обновление ВСЕХ записей в таблице:

update Таблица_про_металл set
Было = Пришло + Осталось;

Если нужно бновить какой-то конкретный:

update Таблица_про_металл set
Было = Пришло + Осталось
where
Уник_Индификатор_Металла = a;

Применяем дженерики в RAD Studio Delphi. Создаем библиотеку сортировки списков однотипных объектов

Сегодня будем создавать в RAD Studio Delphi библиотеку классов, реализующих сортировку списков однотипных объектов.

Цель задачи

Прикладной разработчик должен получить инструмент для создания дочерних классов, в которых можно:

  • оперировать с объектами списка;
  • применять различные правила сравнения объектов;
  • применять различные алгоритмы сортировки объектов.

На выходе должна получиться библиотека классов, которая позволяет:

  • прикладному разработчику сортировать любой из 100 объектов любым из 100 методов сортировки;
  • дорабатывать и поддерживать новые алгоритмы или новые типы объектов в течении одного дня силами одного специалиста.

При создании необходимо учесть, что решение должно удовлетворять следующей модели:

  • Количество алгоритмов сортировки — 100;
  • Типы объектов доступных для сортировки — 100;
  • Количество разработчиков, одновременно работающих с библиотекой, для создания типов объектов и алгоритмов сортировки — 100.
  • Время разработки всех алгоритмов сортировки и типов объектов — 2 дня.

Приступаем

Сортировка по возрастанию — это перестановка элементов набора данных таким образом, чтобы в результате каждый последующий элемент набора был больше предыдущего. Сортировка по убыванию — то же самое, только обход результирующего набора данных нужно начинать с конца.

Сравнение объектов

Чтобы понять, какой элемент набора данных больше другого, для базовых типов необходимо применять оператор сравнения. А как быть с объектами? Базовый модуль System.Generics.Defaults включает в себя нужный нам интерфейс и реализацию класса

В интерфейсе видим единственный метод Compare вида

На входе два параметра типа объект, а на выходе целое число (0 — объекты равны, -1 — первый меньше второго, 1 — первый больше второго).

Для сравнения наших объектов будем использовать свои функции сравнения, которые описывают логику правил сравнения для каждого типа объектов. Заключим такие функции в отдельный класс TAllComparison. В нем и описываются все наши функции сравнения, они имеют тот же вид

А класс TComparer(T) как раз служит для сравнения двух объектов путем вызова метода Compare.
Можно использовать сравнение по умолчанию (Default), или создать свой метод сравнения Construct, чем мы и займемся.

Для удобства описание всех объектов будем хранить в отдельном модуле AllObjects. Здесь же будем хранить описание всех 100 созданных нами объектов.

Операции с объектами

Для осуществления операций с объектами списка в Delphi уже имеется нужный нам параметризированный класс, он же дженерик, с нужными нам методами

Вообще, универсальные параметризированные типы (дженерики) появились еще в Delphi 2009, но для нашего примера я использую RAD Studio Berlin 10.1 UPD1. Если у вас что-то не компилируется, нужно будет допилить пример для своей версии Delphi.

Пишем основной класс нашей библиотеки наследник TList(T)

Основной метод нашей задачи SortBy, опишем его использование далее.

Сортировка объектов

Пишем класс TAllSort, который содержит описание всех 100 методов сортировки вида:

На входе метод получает массив данных из списка, метод сравнения объектов, начальную позицию для сортировки, количество элементов в наборе. На выходе получаем количество произведенных в наборе данных перестановок.

Для удобства, все методы сортировки будем держать в отдельном модуле SortMethods.

Демонстрация

В качестве демонстрации решения представляю 2 механизма сортировки: «Быстрая» и «Пузырьком». Сортировать будем 2 типа объектов: список двумерных векторов (упорядоченные пары) типа Integer и список со строками.

Для начала отсортируем массив строк «пузырьками»:

А теперь «быстро» отсортируем массив двумерных векторов:

Вот такой результат получился с векторами:

Работа со строками в Delphi 10.1 Berlin

Автор: Alex. Опубликовано в Программирование 31 Январь 2020 . просмотров: 23147

Для работы со строками в последних версиях Delphi разработчикам доступно большое количество функций, помимо которых ещё есть помощники для работы со строками, такие как TStringHelper, TStringBuilder и TRegEx. Во всём этом разнообразии бывает сложно найти нужную функцию. Я попытался разобраться, что есть в Delphi 10.1 Berlin для работы со строками и как этим всем пользоваться.

Итак, прежде чем начнём разбираться с функциями, замечу, что начиная с Delphi XE3, появился помощник TStringHelper, и теперь работать со строками можно как с записями. Т.е., если вы определили переменную со строкой (на картинке снизу – это myStr), то вы можете поставить точку и посмотреть, какие функции доступны. Это очень удобно.

Кстати аналогичные помощники появились и для работы с типами Single, Double и Extended: TSingleHelper, TDoubleHelper и TExtendedHelper.

Ну и конечно, помимо помощника TStringHelper, никуда не делся класс TStringBuilder, который используется для работы со строкой как с массивом, и который является полностью совместимым с .NET классом StringBuilder.

А для работы с текстовыми документами незаменимым окажется класс TRegEx, который является обёрткой над библиотекой PCRE, позволяющий использовать регулярные выражения для поиска, замены подстрок и расщепления текста на части.

Все приведённые в статье примеры сделаны с помощью Delphi 10.1 Berlin, поэтому в других версиях Delphi их работа не гарантируется.

Вот основные моменты, которые мы рассмотрим в статье:

Строки в Delphi

В последних версиях Delphi тип string, обозначающий строку, является псевдонимом встроенного типа System.UnicodeString. Т.е. когда вы объявляете переменную str: string, то автоматически вы объявляете переменную типа UnicodeString.

Кстати, на платформе Win32 вы можете использовать директиву « », которая превратит тип string в ShortString. С помощью этого способа вы можете использовать старый 16-битный код Delphi или Turbo Pascal в ваших проектах.

Обратите внимание, что кроме типа UnicodeString и ShortString в Delphi есть и другие типы строк, такие как AnsiString и WideString, однако дальше в статье мы будем рассматривать только работу со строками типа string.

Более глубокое изучение строк в Delphi вы можете начать с прочтения документации здесь.

Инициализация строк

Конечно, начнём мы с инициализации строк. Итак, рассмотрим объявление переменной с типом string.

В этой строчке кода мы объявляем переменную s с типом string, т.е., как было написано выше, по умолчанию с типом UnicodeString. Объявленные переменные с типом UnicodeString, в которые не присвоено значение, всегда гарантированно содержат строку нулевой длины. Чтобы теперь в переменной s была нужная нам строка, нужно просто присвоить переменной другое значение, например:

Это самый простой и часто используемый способ инициализации. Кроме этого есть ряд полезных функций, которые пригодятся вам для инициализации строк в некоторых ситуациях (здесь и далее я буду давать полный код проекта консольного Win32 приложения):

Изменение регистра

Для изменения регистра строк в Delphi есть функции LowerCase, UpperCase, TStringHelper.ToLower, TStringHelper.ToUpper, TStringHelper.ToLowerInvariant и TStringHelper.ToUpperInvariant. В нижний регистр строки меняют функции LowerCase, TStringHelper.ToLower и TStringHelper.ToLowerInvariant, остальные – в верхний. Обратите внимание, что функции LowerCase и UpperCase не работают с кириллицей. Функции TStringHelper.ToUpperInvariant и TStringHelper.ToLowerInvariant всегда работают независимо от текущей пользовательской локали. Вот примеры использования функций:

Конкатенация строк

Здесь конечно самый простой вариант – это использование оператора +. Но есть и другие варианты, например, функция Concat. А если вам нужно в цикле добавлять в конец одной строки большое количество других строк, то здесь пригодится метод Append класса TStringBuilder. Вот пример использования перечисленных способов:

Во всех четырёх переменных, после выполнения нашей программы, будет следующая строка: «Абвгдеёжзиклмнопрст». Четвёртый способ выглядит более громоздким, но у такого способа есть три преимущества. Во-первых, при большом количестве конкатенаций этот способ даст выигрыш по времени по сравнению с первыми тремя способами. Во-вторых, при создании объекта TStringBuilder вы сразу можете задать нужный размер массива для хранения строки, если он конечно известен. Это тоже даст выигрыш по времени. В-третьих, функция Append принимает на вход не только строки, но и другие типы, такие как Integer и Single, автоматически преобразуя их в строку.

Третий способ удобно использовать, если нужно сложить строки, находящиеся в массиве или списке. К тому же здесь первым параметром можно задать строку-разделитель, которая будет вставлена между строками, взятыми из массива. Вот пример, в котором формируется строка со списком городов, разделённых запятыми:

В результате выполнения этой функции получится строка «Москва, Санкт-Петербург, Севастополь».

Вставка подстроки в строку

Для того чтобы вставить внутрь строки подстроку вы можете использовать процедуру Insert или функцию TStringHelper.Insert. У класса TStringBuilder тоже есть аналогичная функция. Кстати, функция TStringBuilder.Insert, кроме строк умеет вставлять и другие типы, такие как Integer и Single, автоматически преобразуя их в строку. Вот пример использования:

Обратите внимание, в процедуре Insert нумерация символов начинается с 1, а в функциях TStringHelper.Insert и TStringBuilder.Insert – с 0. Все приведённые способы меняют строку, хранящуюся в переменной.

Удаление части строки

Допустим, вам нужно удалить из строки часть символов. Здесь нам помогут процедура Delete и функция TStringHelper.Remove. У класса TStringBuilder тоже есть функция Remove. Вот примеры использования:

Во всех трёх способах из строки «Абвгд» получится строка «Агд». Обратите внимание, что в процедуре Delete нумерация символов начинается с 1, а в функциях Remove – с 0.

Также интересно, что функция TStringHelper.Remove не трогает исходную строку. Вместо этого она возвращает новую строку с удалёнными символами. Именно поэтому мы присваиваем результат обратно в переменную. Процедура Delete работает по-другому: она меняет исходную строку.

Помимо приведённых здесь вариантов, для удаления части строки можно использовать функции замены подстроки, просто для этого искомая подстрока заменяется на пустую, например, StringReplace(str1, substr1, »).

Копирование части строки

Здесь идёт речь о том, что часть длиной строки нужно скопировать в новую строку или массив символов. Для этого в Delphi есть функции LeftStr, RightStr, Copy, TStringHelper.Substring и TStringHelper.CopyTo. А в классе TStringBuilder – только функция CopyTo. Есть также функция MidStr в юните System.StrUtils, которая работает аналогично функции Copy, поэтому в примере её не будет.

Первые два способа копируют часть строки слева (функция LeftStr) или справа (RightStr). Остальные четыре способа подходят, как для копирования части строки слева или справа, так и из середины.

В способах 3-6 из примера мы получим сроку «вгд» или массив [‘в’, ‘г’, ‘д’]. Обратите внимание, что в функциях Copy и MidStr нумерация символов начинается с 1, а во всех остальных с 0. Исходная строка или массив символов во всех четырёх способах не меняется.

Сравнение строк

Конечно, сравнивать строки можно с помощью операторов =, , >= и <>. Но кроме этого существуют ещё много функций: StrComp, StrIComp, StrLComp, StrLIComp, CompareStr, CompareText, TStringHelper.Compare, TStringHelper.CompareOrdinal, TStringHelper.CompareTo, TStringHelper.CompareText, SameStr, SameText, TStringHelper.Equals и TStringBuilder.Equals. Функции SameText, StrIComp, CompareText, TStringHelper.CompareText и TStringHelper.Compare умеют производить регистронезависимое сравнение строк, остальные функции и операторы — регистрозависимое.

Третьим параметром в функциях CompareText и SameText можно указать, что нужно использовать для сравнения строк пользовательскую локаль. В этом случае вы сможете сравнивать строки с русскими буквами независимо от регистра, если конечно в ОС используется русский язык.

Самая продвинутая здесь функция – это TStringHelper.Compare. С помощью неё можно сравнивать не только целые строки, но и части строк. Здесь можно настроить зависимость от регистра, включить игнорирование символов и знаков препинания или сравнение цифр как чисел и т.д.

Операторы, а также функции TStringHelper.Equals и TStringBuilder.Equals, в результате сравнения, отдадут вам True, если условие верно, и False, если условие не верно. Функции CompareStr, CompareText, TStringHelper.Compare, TStringHelper.CompareTo, TStringHelper.CompareOrdinal и TStringHelper.CompareText работают по-другому. Они сравнивают строки с точки зрения сортировки. Функции возвращают отрицательное число, если строка, указанная в первом параметре, сортируется до строки, указанной во втором параметре, положительное число — если первая строка сортируется после второй и 0 – если строки равны.

Функции SameStr, SameText, TStringHelper.Equals и TStringBuilder.Equals сравнивают строки на соответствие.

Итак, вот примеры использования вышеперечисленных функций и операторов:

Поиск подстроки в строке

Теперь давайте посмотрим, как можно найти подстроку (определённую последовательность символов) в строке. Здесь у вас есть большой выбор функций, которые возвращают либо индекс найденной подстроки, либо true или false в зависимости от того, найдена подстрока в строке или нет. Итак, давайте перечислим все функции для поиска подстроки:

В первую очередь – это функция Pos, которая ищет подстроку, начиная с указанного номера символа. Функция осуществляет регистрозависимый поиск. Здесь нумерация символов начинается с 1. Если подстрока найдена, то возвращается номер первого символа найденной подстроки, иначе – 0. Есть также функция PosEx (в юните System.StrUtils), которая работает абсолютно также. Вот пример использования функции Pos:

Аналогично функции Pos работают и функции IndexOf и LastIndexOf помощника TStringHelper. Они также осуществляют регистрозависимый поиск. Функция IndexOf ищет подстроку (или символ) с начала и до конца строки, а функция LasIndexOf – наоборот, т.е. с конца и до начала. Если подстрока найдена, то функции возвращают индекс первого символа найденной подстроки в строке. Здесь нумерация символов начинается с 0. Если подстрока не найдена, то функции возвращают -1. Также при поиске вы можете задать начало и интервал поиска. Вот примеры использования этих функций:

Теперь рассмотрим функции для проверки, есть ли подстрока в строке, и не важно, в каком месте. Для этого есть функции ContainsStr и ContainsText в юните System.StrUtils, а также функция Contains в помощнике TStringHelper.Contains. Функции ContainsStr и TStringHelper.Contains – регистрозависимые, а функция ContainsText – нет. Вот примеры использования этих функций:

Дополнительно есть функции проверяющие, наличие определённой подстроки в начале или в конце текста. Это функции StartsStr, StartsText, EndsStr и EndsText в юните System.StrUtils, а также функции StartsWith, EndsWith и EndsText у помощника TStringHelper. Функции StartsStr и EndsStr регистрозависимые, функции StartsText, EndsText и TStringHelper.EndsText регистронезависимые, а у функций TStringHelper.StartsWith и TStringHelper.EndsWith есть второй параметр для выбора режима поиска. Учтите, что регистронезависимый поиск в функции TStringHelper.StartsWith работает только с буквами латинского алфавита. По умолчанию поиск в функциях TStringHelper.StartsWith и TStringHelper.EndsWith регистрозависимый.

Обратите внимание, что регистронезависимый поиск в функциях StartsText, EndsText и TStringHelper.EndsText и TStringHelper.EndsWith ведётся для текущей локали. Т.е. если на компьютере будет установлена английская локаль, то регистронезависимый поиск по русскому тексту работать не будет.

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

И конечно самые продвинутые условия для поиска подстрок можно задавать при помощи регулярных выражений. Для этого есть функции TRegEx.Match и TRegEx.Matches. Вот несколько примеров использования этих функций:

Примеры и описание регулярных выражений смотрите на сайте библиотеки PCRE.

Поиск символов в строке

Случается, что нужно найти определённые символы в строке. Конечно, для этого вы можете воспользоваться функциями для поиска подстроки, о которых было написано выше, но есть и специальные функции, позволяющие найти первый попавшийся в строке символ из нескольких искомых. Это функции помощника TStringHelper: IndexOfAny, IndexOfAnyUnquoted и LastIndexOfAny. Функции IndexOfAny и IndexOfAnyUnquoted ищут, перебирая символы сначала до конца строки, а функция LastIndexOfAny – наоборот. Во всех функциях можно указать интервал поиска. Функция IndexOfAnyUnquoted умеет игнорировать символы, заключенные в кавычки, скобки и т.п. Вот пример использования этих функций:

Замена подстроки в строке

Для поиска и замены подстроки (или символа) в строке можно использовать функции StringReplace, ReplaceStr и ReplaceText, TStringHelper.Replace, TStringBuilder.Replace и TRegEx.Replace. Функции ReplaceStr и TStringBuilder.Replace – регистрозависимые, функция ReplaceText – регистронезависимая, в функциях StringReplace, TStringHelper.Replace и TRegEx.Replace зависимость от регистра настраивается флажком rfIgnoreCase. Функции TRegEx.Replace ищут подстроку, используя регулярные выражения. В функции TStringBuilder.Replace можно задать диапазон поиска подстроки. Вот примеры использования этих функций:

Обрезка пробелов и управляющих символов

Для такой часто встречающейся операции, как удаление пробелов и управляющих символов в начале и в конце строки, есть несколько функций: Trim, TrimLeft, TrimRight, TStringHelper.Trim, TStringHelper.TrimLeft и TStringHelper.TrimRight. При вызове функций TStringHelper.Trim, TStringHelper.TrimLeft и TStringHelper.TrimRight вы можете перечислить, какие символы нужно удалять. Вот пример использования этих функций:

Выравнивание текста за счёт установки пробелов

И напоследок ещё пара интересных функций, которые умеют дополнять строку пробелами или другими символами, пока она не станет нужной длины. Это функции TStringHelper.PadLeft и TStringHelper.PadRight. С помощью этих функций, например, для лучшего восприятия можно добавить пробелы в начало чисел, которые вы выдаёте столбиком в консоли или дополнить числа ведущими нулями. Вот пример использования этих функций:

Вместо заключения

Итак, в статье я постарался собрать все возможные функции Delphi, которые постоянно нужны при работе со строками. Надеюсь, вы найдёте в этой статье что-то новое и интересное для себя. Если я упустил что-то важное на ваш взгляд, просьба не держать это в себе, а написать об этом в комментариях.

DELPHI ! Срочно плиззз.

надо по частям разделить адрес файла допустим
c:\doc\uu\ii\tt\win.dat

надо по частям получить
doc
uu
ii
tt

какой нето функцией если есть — или придеться самому писать?

function ExtractWord(N: Integer; const S: string; const WordDelims: TCharSet): string;

N — порядковый номер слова; WordDelims — множество символов-разделителей слов. Количество слов возвращает

Например нам нужно из ip-адреса (172.26.14.78) получить значения каждого байта:

var SL:TStringList;
begin
SL:=TStringList.Create;
try
ExtractStrings([‘.’], [‘ ‘], PChar(‘172.26.14.78’), SL);
finally
sl.Free;
end;
end;

В итоге мы получим в SL следующие значения:
SL[ 0 ]=’172′
SL[ 1 ]=’26’
SL[ 2 ]=’14’
SL[ 3 ]=’78’

Delphi. RightStr.

В универе дают делфи. Я вот всю жизнь на VB, поэтому тут туплю. В справке написано:

>Delphi syntax:
>function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
>function RightStr(const AText: WideString; const ACount: Integer): WideString; overload;

Дайте пример как это реализовать. На VB, например, было бы так:
a1 = left(text1.text, 7)
А на делфи как не соображу 8(

Вы чо гонево палите то? =)))

Так и пишется: a1 := RightStr(text1.text, 7); // =))) Что тебя вообще смутило то.

з.ы. Дайте пример кода для messagebox

Слабо подключить модуль StrUtils?

oistalker
>Слабо подключить модуль StrUtils?
>uses . StrUtils. ;

Спасибо, не слабо. Но я вроде ясно сказал, что я «всю жизнь на VB, поэтому тут (на delphi) туплю».

Alprog
>Дайте пример кода для messagebox
Это MessageBox?

MessageBox(0,’Hello’,’msg’,MB_OK);
Вместо 0 можно поставить хендл окна, или так:
Application.MessageBox(‘Hello’,’msg’,MB_OK);

>Имхо, после основы топега, ты лох в программировании

Не ну честно. Хотя бы сообщения компилятора об ошибках на русиш сперва перевел бы, а там уж думал.
Что толку говорить «выражение не работает», если ошибка прямо говорит о том, что не все модули дома.
Блин.
Ты же вроде уже что-то программил. Как так?
Или я путаю с каким-то художником?

=A=L=X=
Да я программер. При том программер самоучка, который писал только на Visual Basic.
Я сделал несколько поделок, всё они, конечно, не заслуживают особого уважения, но всё-таки есть кое-что.
Их можно посмотреть у меня на сайте. Сейчас работаю над более-менским проектом. Ссылку я давал на него
в 9 посту. Между тем, все кто видели редактор карт к этой игрухе, давали в основном только положительные
отзывы на этом сайте.

На Delphi я же пока полный дурак. Первый раз попросил помощи у тех, кто на делфи (в VB не надо поключать модули и дебагера нет внизу), и они меня только облажали. 8(
В то время как, любой нубский вопрос у бейсиковцев воспринимается дружелюбно.
А потом ещё говорят: переходи на delphi, visual basic — отстой.

Просто я в последнее время на нубские вопросы нервно стал реагировать.
В MessageBox (и некоторых других ф-ях WinAPI) может представлять проблему (как раз твой случай) второй и третий параметры. Если в качестве строки передавать дельфийскую переменную типа String компилится не будет, нужно оформлять через приведение строки к PChar:
MessageBox( Form1.Handle, PChar( caption ), PChar( msg + ‘some other’ ), MB_OK );

Илон Маск рекомендует:  Краткое описание процессоров AMD Vishera, отзывы покупателей
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL