Code archives/Algorithms/LikeString
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This function checks if a string contains a substring. It works like the Instr() function of BlitzMax, but it allows to use wildcards (*) to match different substring in one pass. * =means any quantity of any character. Example: My string is = "GadgetPrint" Instr ("GadgetPrint","Print") = 1 LikeString("GadgetPrint","Gad*P*nt")=1 Find if in the string there something that contains GAD AND P AND nt. Other options are: - third parameter UPPERCASE=0 : if setted to 1 the function will ignore character case - if the string to find starts with *, the function checks if the string FINISHES with the string; LikeString("GadgetPrint","*Print") - if the string to find finishes with *, the function checks if the string STARTS with the string. LikeString("GadgetPrint","Gadget*") The function acts in the same way of LIKE function of SQL languages. | |||||
Rem LikeString function return = LikeString("Gadget","G*adg",UpperCase=0|1) LikeString(where$,what$,uppercase=0|1) return 1 : it contains what ' ----- example local parole$[]=["computer","transputer","company","DisableGadget","GadgetPrint","GadgetCopy"] Print "Contains something..." Print For Local ss$=EachIn parole Print ss+" contains TER "+LikeString(ss,"ter") Next Print Print "Finish with TER" Print For ss$=EachIn parole Print ss+" finishes with "+LikeString(ss,"*ter") Next Print Print "Start with GADGET" Print For ss$=EachIn parole Print ss+" starts with "+LikeString(ss,"Gadget*") Next Print Print "Contains ABLE & Gad (no case)" Print For ss$=EachIn parole Print ss+" contains (able*gad) "+LikeString(ss,"*abl*Gad*",1) Next Print LikeString("gadgetprint","g*pr*") Print LikeString("gadgetprint","g*p*t") End Rem Function LikeString:Int(where$="",find$="",_case:Int=0) If where="" Return 0 If find="" Return 0 Local _start:Int,_finish:Int Local what$ Local lenwhat:Int If _case=1 where=Upper(where);find=Upper(find) If Left(find,1)="*" _finish=1;what=find[1..] If Right(find,1)="*" _start=1;what=find[..Len(find)-1] lenwhat=Len(what) If _finish=1 If Right(where,lenwhat)=WHAT Return 1 End If If _start=1 If Left(where,lenwhat)=WHAT Return 1 End If End If find=find+"*" Local p1:Int Local last_pos:Int,pa_count:Int,pa$[],papos:Int[] find=Replace(find,"**","*") While p1<Len(find) If find[p1]=Asc("*") pa=pa[..pa_count+1] papos=papos[..pa_count+1] pa[pa_count]=find[last_pos..p1] papos[pa_count]=last_pos last_pos=p1+1 pa_count:+1 EndIf p1:+1 Wend Local result:Int,counter:Int,cpos:Int For Local ss$=EachIn pa cpos=Instr(where,ss) If cpos>0 If papos[counter]<=cpos result:+1 End If counter:+1 Next If result=pa.length Return 1 Else Return 0 End Function |
Comments
| ||
Good and smart, but ... You should additionaly implement ? (single char) and # (numeric char). Do not forget _ for any space ^^ |
Code Archives Forum