Code archives/Miscellaneous/Like Function
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
I converted this routine from one in Qbasic that was posted somewhere. It still looks a bit rough, but it works. | |||||
; Like Function - pattern matching routine. ; ; ? Any single character. ; * Zero Or more characters. ; # Any single digit (0-9). ; [charlist] Any single character in charlist. ; [!charlist] Any single character Not in charlist. ; ; A group of one Or more characters (charlist) enclosed in brackets ([ ]) ; can be used To match any single character in String And can Include almost ; any character code, including digits. ; ; Note: To match the special characters Left bracket ([), question ; mark (?), number sign (#), And asterisk (*), enclose them in brackets. ; The Right bracket (]) can't be used within a group To match itself, but ; it can be used outside a group as an individual character. ; ; By using a hyphen (-) To separate the Upper And Lower bounds of the range, ; charlist can specify a range of characters. For example, [A-Z] results in ; a match If the corresponding character position in String contains any ; uppercase letters in the range A-Z. Multiple ranges are included within ; the brackets without delimiters. Function Like(Parse$,Pattern$) INVERT$="!" While Pattern <> "" Select Mid$(Pattern, 1, 1) Case "?" If Parse = "" Then Return 0 Case "#" If IsDigit(Mid$(Parse, 1, 1)) = 0 Then Return 0 Case "*" Repeat Pattern = Mid$(Pattern, 2, Len(Pattern) - 1) Until Mid$(Pattern, 1, 1) <> "*" If Pattern = "" Then Return 1 While Parse <> "" If Like(Parse, Pattern) Then Return 1 If Parse <> "" Then Parse = Mid$(Parse,2,Len(Parse)-1) Wend Return 0 Case "[" reverse = (Mid$(Pattern,2,1) = INVERT) If reverse Then Pattern = Mid$(Pattern,2,Len(Pattern)-1) prev = -1 : esc=1: matched = 0 Repeat Pattern = Mid$(Pattern,2,Len(Pattern)-1) If (Pattern <> "") And (Mid$(Pattern,1,1) <> "]") Then If Mid$(Pattern, 1, 1) = "-" Then Pattern = Mid$(Pattern,2,Len(Pattern)-1) If Pattern = "" Then Return 0 matched = matched Or (Mid$(Parse,1,1) <= Mid$(Pattern,1,1) And Asc(Mid$(Parse,1,1)) >= prev) Else matched = matched Or (Mid$(Parse,1,1) = Mid$(Pattern,1,1)) End If prev = Asc(Mid$(Pattern,1,1)) Else Exit End If Forever If (prev = -1 Or Mid$(Pattern,1,1) <> "]" Or Abs(matched) = Abs(reverse)) Then Return 0 Default If Mid$(Parse,1,1) <> Mid$(Pattern,1,1) Then Return 0 End Select Parse = Mid$(Parse,2,Len(Parse)-1) Pattern = Mid$(Pattern,2,Len(Pattern)-1) Wend Return Abs(Len(Parse) = 0) End Function Function IsDigit(S$) If S >= "0" And S <= "9" Then Return 1 Else Return 0 End Function |
Comments
None.
Code Archives Forum