Приведу несколько простых функций, позволяющих работать с отдельными словами в строке. Возможно они пригодятся вам для разбивки текстовых полей на отдельные слова (for i := 1 to NumToken do ...) с последующим сохранением их в базе данных.
function GetToken(aString, SepChar: string; TokenNum: Byte): string;
{
параметры: aString : полная строка
SepChar : единственный символ, служащий
разделителем между словами (подстроками)
TokenNum: номер требуемого слова (подстроки))
result : искомое слово или пустая строка, если количество слов
меньше значения 'TokenNum'
}var
Token: string;
StrLen: Byte;
TNum: Byte;
TEnd: Byte;
begin
StrLen := Length(aString);
TNum := 1;
TEnd := StrLen;
while ((TNum <= TokenNum) and (TEnd <> 0)) dobegin
TEnd := Pos(SepChar, aString);
if TEnd <> 0 thenbegin
Token := Copy(aString, 1, TEnd - 1);
Delete(aString, 1, TEnd);
Inc(TNum);
endelsebegin
Token := aString;
end;
end;
if TNum >= TokenNum thenbegin
GetToken1 := Token;
endelsebegin
GetToken1 := '';
end;
end;
function NumToken(aString, SepChar: string): Byte;
{
parameters: aString : полная строка
SepChar : единственный символ, служащий
разделителем между словами (подстроками)
result : количество найденных слов (подстрок)
}var
RChar: Char;
StrLen: Byte;
TNum: Byte;
TEnd: Byte;
beginif SepChar = '#' thenbegin
RChar := '*'
endelsebegin
RChar := '#'
end;
StrLen := Length(aString);
TNum := 0;
TEnd := StrLen;
while TEnd <> 0 dobegin
Inc(TNum);
TEnd := Pos(SepChar, aString);
if TEnd <> 0 thenbegin
aString[TEnd] := RChar;
end;
end;
Result := TNum;
end;
Или другое решение:
function CopyColumn(const s_string: string; c_fence: char; i_index: integer):
string;
var
i, i_left: integer;
begin
result := EmptyStr;
if i_index = 0 thenbegin
exit;
end;
i_left := 0;
for i := 1 to Length(s_string) dobeginif s_string[i] = c_fence thenbegin
Dec(i_index);
if i_index = 0 thenbegin
result := Copy(s_string, i_left + 1, i - i_left - 1);
exit;
endelsebegin
i_left := i;
end;
end;
end;
Dec(i_index);
if i_index = 0 thenbegin
result := Copy(s_string, i_left + 1, Length(s_string));
end;
end;
Я знаю что в GetToken параметр SepChar (в моем случае c_fence) строка, не
символ, но комментарий гласит, что функция ожидает единственный символ в этой
строке, и это очевидно, поскольку если вы пошлете более одного символа, функция
попросту несработает. ( Delete(aString,1,TEnd) будет ошибкой, если Length(
SepChar ) > 1 ).
Программный сегмент на языке Delphi!
Обзор кода:
Функция GetToken
Эта функция принимает три параметра: aString (исходная строка), SepChar (один символ, используемый как разделитель между словами) и TokenNum (номер слова, которое нужно извлечь).
Функция проходит по строке с помощью цикла while, пока не найдет запрошенное слово или не дойдет до конца строки. Она использует функцию Pos для нахождения позиции разделителя и затем извлекает токен с помощью функции Copy. Если токен был найден, она обновляет переменную Token и увеличивает TNum. Если не было найдено, она устанавливает Token в пустую строку.
Функция NumToken
Эта функция принимает два параметра: aString (исходная строка) и SepChar (один символ, используемый как разделитель между словами). Она считает количество токенов в строке с помощью цикла while. Для каждого шага она увеличивает TNum и обновляет разделитель на конце токена.
Альтернативное решение: функция CopyColumn
Эта функция принимает три параметра: s_string (исходная строка), c_ fence (один символ, используемый как делимитатор) и i_index (индекс столбца, который нужно извлечь). Она возвращает указанный столбец в виде строки.
Функция проходит по строке с помощью цикла for, отслеживая текущий индекс. Когда она находит делимитатор, она уменьшает счетчик индекса. Если индекс достигнет 0, она извлекает токен с помощью функции Copy и выходит из функции. В противном случае она обновляет левый индекс до позиции после делимитатора.
Примечание
Как вы упомянули, комментарий гласит, что параметр SepChar должен быть одиночным символом, что не соответствует вашему примеру. Это может привести к ошибкам, если используются несколько символов как разделители. Для исправления этого можно модифицировать функции для принятия массива строк или использовать другой подход для токенизации входных данных.
В целом, эти функции предоставляют простой способ извлечь слова из строки на основе символа-разделителя. Однако они могут требовать некоторых модификаций для обработки краевых случаев и обеспечения корректной работы.
Выберите слово из строки по номеру: функции для выделения и обработки отдельных слов в строке с помощью разделителей между словами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.