Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Синтаксис , Текст и Строки

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

Приведу несколько простых функций, позволяющих работать с отдельными словами в строке. Возможно они пригодятся вам для разбивки текстовых полей на отдельные слова (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)) do
  begin
    TEnd := Pos(SepChar, aString);
    if TEnd <> 0 then
    begin
      Token := Copy(aString, 1, TEnd - 1);
      Delete(aString, 1, TEnd);
      Inc(TNum);
    end
    else
    begin
      Token := aString;
    end;
  end;
  if TNum >= TokenNum then
  begin
    GetToken1 := Token;
  end
  else
  begin
    GetToken1 := '';
  end;
end;

function NumToken(aString, SepChar: string): Byte;
{
parameters: aString : полная строка

SepChar : единственный символ, служащий
разделителем между словами (подстроками)
result    : количество найденных слов (подстрок)
}
var
  RChar: Char;
  StrLen: Byte;
  TNum: Byte;
  TEnd: Byte;
begin
  if SepChar = '#' then
  begin
    RChar := '*'
  end
  else
  begin
    RChar := '#'
  end;
  StrLen := Length(aString);
  TNum := 0;
  TEnd := StrLen;
  while TEnd <> 0 do
  begin
    Inc(TNum);
    TEnd := Pos(SepChar, aString);
    if TEnd <> 0 then
    begin
      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 then
  begin
    exit;
  end;
  i_left := 0;
  for i := 1 to Length(s_string) do
  begin
    if s_string[i] = c_fence then
    begin
      Dec(i_index);
      if i_index = 0 then
      begin
        result := Copy(s_string, i_left + 1, i - i_left - 1);
        exit;
      end
      else
      begin
        i_left := i;
      end;
    end;
  end;
  Dec(i_index);
  if i_index = 0 then
  begin
    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




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


:: Главная :: Текст и Строки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-04 05:43:56/0.0057120323181152/0