Советы по 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)) dobeginTEnd := Pos(SepChar,aString);if TEnd <> 0 thenbeginToken := Copy(aString,1,TEnd-1);Delete(aString,1,TEnd);Inc(TNum);endelsebeginToken := aString;end;end;if TNum >= TokenNum thenbeginGetToken1 := Token;endelsebeginGetToken1 := '';end;end;

function NumToken(aString, SepChar: String):Byte;
{
parameters: aString : полная строка
SepChar : единственный символ, служащийразделителем между словами (подстроками)result : количество найденных слов (подстрок)
}

var
RChar : Char;StrLen : Byte;TNum : Byte;TEnd : Byte;
begin
if
SepChar = '#' thenbeginRChar := '*'endelsebeginRChar := '#'end;StrLen := Length(aString);TNum := 0;TEnd := StrLen;while TEnd <> 0 dobeginInc(TNum);TEnd := Pos(SepChar,aString);if TEnd <> 0 thenbeginaString[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 beginexit;end;i_left := 0;for i := 1 to Length( s_string ) do beginif s_string[ i ] = c_fence then beginDec( i_index );if i_index = 0 then beginresult := Copy( s_string, i_left + 1, i - i_left - 1 );exit;end else begini_left := i;end;end;end;Dec( i_index );if i_index = 0 then beginresult := Copy( s_string, i_left + 1, Length( s_string ));end;end;

Я знаю что в GetToken параметр SepChar (в моем случае c_fence) строка, не символ, но комментарий гласит, что функция ожидает единственный символ в этой строке, и это очевидно, поскольку если вы пошлете более одного символа, функция попросту несработает. ( Delete(aString,1,TEnd) будет ошибкой, если Length( SepChar ) > 1 ). [000251]



Содержание раздела