Mega Code Archive

 
Categories / Delphi / Strings
 

A Class to Get Tokens, Parse Strings, Count Words, Search Tokens

Title: A Class to Get Tokens, Parse Strings, Count Words, Search Tokens. Question: A general way for get tokens, parse strings, count words and search for a specific token on a string. Answer: There are many functions and ways for get a token on a string. I have written a general class for handle tokens and parse strings. The class is named as TToken. I want to describe it with some examples. var xTk: TToken; i: Integer; s: String; b: Boolean; begin xTk:=TToken.Create; {////////// the class has some variables: TEXT contains the string to handle SEPS contains the set of characters that separate tokens } xTk.Text:='Here is my example. Contains commas, dots and spaces.'; xTk.Seps:=[' ',',','.']; {////////// with the method COUNT I can count the number of tokens. I can use it on two ways, I can call the method and the variable NUMTOKENS save the number of tokens or I can assign the method to a memory variable. Here is the example of the two ways. } i:=xTk.Count; ShowMessage(IntToStr(i)); ShowMessage(IntToStr(xTk.NumTokens)); {////////// When I want to search all tokens on a sequential way Im going to use the methods FIRT and NEXT. Im going to use two Variables: MORETOKENS and LASTTOKEN. MORETOKENS is a boolean variabale that indicates that after I execute the First or Next method I have a token that is saved on the LASTTOKEN variable } xTk.First; while xTk.MoreTokens do begin ShowMessage(xTk.LastToken); xTk.Next; end; {////////// I can assign the Firt and Next method to a memory variable and I can use the variable NOTOKEN that contains the negative value of MORETOKENS } s:=xTk.First; while not xTk.NoToken do begin ShowMessage(s); s:=xTk.Next; end; {////////// I can search for a specific token with the SEARCH method } b:=xTk.Search('IS'); if b then ShowMessage('Found it') else ShowMessage('Not found it'); b:=xTk.Search('YOUR'); if b then ShowMessage('Found it') else ShowMessage('Not found it'); xTk.Free; end; /////////////////////////////////////////////////////////////// The class is: unit UToken; { Class for handle Tokens Author: Alejandro Castro } interface uses SysUtils; type TToken = Class(Tobject) private xCharText: String; function xGetToken(xText: String): String; public Seps: set of char; // Separators Text: String; // string to handle LastToken: String; // token readed with first or next method NoToken: Boolean; // flag that indicate that there ARENT more tokens MoreTokens: Boolean;// flag that indicate that there ARE more tokens NumTokens: Integer; // no of tokens on Text constructor Create; function Count: Integer; // count the number of tokens function First: String; // Find the First Token function Next: String; // Find the Next Token function Search(TokSearch: String): Boolean;// Search for a specific token end; implementation constructor TToken.Create; begin Seps:=[]; Text:=''; xCharText:=''; NoToken:=True; MoreTokens:=False; LastToken:=''; end; function TToken.Count: Integer; var i,xLen: Integer; xFlag: Boolean; begin NumTokens:=0; xLen:=length(Text); i:=1; xFlag:=False; while (i0) do begin if (Text[i] in Seps) then xFlag:=False else begin if (not xFlag) then begin xFlag:=True; inc(NumTokens); end; end; inc(i); end; Result:=NumTokens; end; function TToken.Next: String; begin Result:=xGetToken(xCharText); LastToken:=Result; if Result='' then NoToken:=True else NoToken:=False; MoreTokens:=not NoToken; end; function TToken.First: String; begin Result:=xGetToken(Text); LastToken:=Result; if Result='' then NoToken:=True else NoToken:=False; MoreTokens:=not NoToken; end; function TToken.xGetToken(xText: String): String; var i,xLen: Integer; xFlag,xAgain: Boolean; begin Result:=''; xLen:=length(xText); i:=1; xFlag:=False; xAgain:=True; while (i0) and (xAgain) do begin if (xText[i] in Seps) then begin xAgain:=(xAgain and (not xFlag)); xFlag:=False end else begin if (not xFlag) then begin xFlag:=True; xAgain:=true; end; Result:=Result+xText[i]; end; inc(i); end; xCharText:=copy(xText,i,xLen); end; function TToken.Search(TokSearch: String): Boolean; var xAgain: Boolean; begin Result:=False; xAgain:=True; First; while (not noToken) and (xAgain) do begin if UpperCase(LastToken)=UpperCase(TokSearch) then begin Result:=true; xAgain:=False; end; Next; end; end; end.