Search Tools Links Login

Advanced Like


Visual Basic 6, or VB Classic

Compare using wildcards like * and ?, ranges like "at[0-99].gif", and a new wildcard %. Which is like *, but goes only at the end. "at%" would be like "at", and also "atquaz".

Original Author: Techni Rei Myoko

Inputs

filter - a pattern to compare with
expression - the text to check

Returns

boolean

Code

Option Explicit
Public Function advlike(filter As String, expression As String) As Boolean
Dim curr_filter As Long, curr_text As Long, buffer As Boolean, temp As Long, tempstr As String, temp2 As Long, tempstr2 As String
curr_text = 1
buffer = True
Do Until curr_filter = Len(filter) Or buffer = False
  curr_filter = curr_filter + 1
  Select Case Mid(filter, curr_filter, 1)
    Case "*"
      If curr_filter = Len(filter) Then
        curr_text = Len(expression) - 1
      Else
        curr_text = InStr(curr_text, expression, Mid(filter, curr_filter + 1, 1)) - 1
        If curr_text <= 0 Then buffer = False
      End If
    Case "%": curr_text = Len(expression) - 1
    Case "?" 'should just skip right over this with no problem at all
    Case "["
      temp = InStr(curr_filter, filter, "]") 'contains the ending ("]") delimeter for qualifications
      tempstr = Mid(filter, curr_filter + 1, temp - curr_filter - 1) 'contains qualifications
      'curr_text contains the start of the expression
      If curr_filter = Len(filter) Then
        temp2 = Len(expression) ' contains the end of the expression
      Else
        tempstr2 = Mid(filter, InStr(curr_filter, filter, "]") + 1, 1) ' contains the end of the expression
        temp2 = InStr(curr_text, expression, tempstr2)
      End If
      If temp2 = 0 Then
        buffer = False
      Else
        tempstr2 = Mid(expression, curr_text, temp2 - curr_text) 'contains expression
        If multicompare(tempstr2, tempstr) = False Then
          buffer = False
        Else
          curr_text = curr_text + Len(tempstr2) - 1
          curr_filter = curr_filter + Len(tempstr) + 1
        End If
      End If
    Case Else: If Mid(filter, curr_filter, 1) <> Mid(expression, curr_text, 1) Then buffer = False
  End Select
  curr_text = curr_text + 1
  
  'if current text loc is past the end of the expression when there is still untested filter chars
  If curr_text > Len(expression) And curr_filter + 1 < Len(filter) Then buffer = False
Loop
advlike = buffer
End Function
Public Function multicompare(text As String, qualifications As String) As Boolean
qualifications = Replace(qualifications, " ", Empty)
If InStr(qualifications, ",") = 0 Then
  multicompare = compare(text, qualifications)
Else
  Dim temp As Long, tempstr() As String
  tempstr = Split(qualifications, ",")
  For temp = 0 To UBound(tempstr)
    If compare(text, tempstr(temp)) Then multicompare = True
  Next
End If
End Function
Public Function compare(text As String, qualifier As String)
  Dim tempstr() As String
  If InStr(qualifier, "-") > 0 Then
    tempstr = Split(qualifier, "-")
    If isnumeric2(tempstr(0)) And isnumeric2(tempstr(1)) Then
      compare = Val(text) >= Val(tempstr(0)) And Val(text) <= Val(tempstr(1))
    Else
      compare = text >= tempstr(0) And text <= tempstr(1)
    End If
  Else
    If isnumeric2(qualifier) Then
      compare = Val(text) = Val(qualifier)
    Else
      compare = text = qualifier
    End If
  End If
End Function
Public Function islike(filter As String, expression As String) As Boolean
  On Error Resume Next
  Dim tempstr() As String, count As Long
  If Replace(filter, ";", Empty) <> filter Then
    tempstr = Split(filter, ";")
    islike = False
    For count = LBound(tempstr) To UBound(tempstr)
      If advlike(tempstr(count), expression) Then islike = True
    Next
  Else
    If advlike(filter, expression) Then islike = True
  End If
End Function
Public Function isnumeric2(text As String) As Boolean
isnumeric2 = IsNumeric(Replace(Replace(text, "-", Empty), ".", Empty))
End Function

About this post

Posted: 2003-06-01
By: ArchiveBot
Viewed: 103 times

Categories

Visual Basic 6

Attachments

No attachments for this post


Loading Comments ...

Comments

No comments have been added for this post.

You must be logged in to make a comment.