Разбивка строки на слова

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Приведу несколько простых функций, позволяющих работать с отдельными словами в строке. Возможно они пригодятся вам для разбивки текстовых полей на отдельные слова (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 ).

{/codecitation}

Добавить комментарий