Hola Bravenap, creo que te podrías ahorra código y objetos utilizando otra lógica... ademas de que nmo es necesaria usar un objeto de tipo Regex..(tambien te ahorrarias el método preparaCadena

)
Podría quedarte mas o menos así tu funcion...(es solo una idea..)
Cita: Private Function PrepareQuery(ByVal sText As String, ByVal sTableName As String) As String
Dim arrCriteries() As String = {".O", ".Y", ".NO"}
Dim arrReplacements() As String = {"OR", "AND", "NOT"}
Dim myString As String = sText.Trim 'quito los espacios si hay
Dim i As Int16 = 0
Dim iTam As Int16 = arrCriteries.Length
For i = 0 To iTam - 1
myString = myString.Replace(arrCriteries(i), arrReplacements(i))
Next
Dim myStringTemp As String = String.Empty
Dim b As Boolean = True 'verifico que sea una cadena y no un criterio
For Each sTemp As String In myString.Split(New Char() {" "})
For ix As Int16 = 0 To iTam - 1
If sTemp = arrReplacements(ix) Then b = False
Next
If b Then
myStringTemp &= " " & sTableName & " LIKE '*" & sTemp & "*' "
Else
myStringTemp &= " " & sTemp 'concateno el criterio
End If
b = True
Next
myStringTemp = "SELECT * FROM tabla WHERE ( " & myStringTemp & " )"
Return myStringTemp
End Function
Y ya la mandas a llamar por ejemplo:
Cita: MessageBox.Show(PrepareQuery(TextBox1.Text, "Nombre"))
Y en tus arrays puedes guardar la cantidad que desees de criterios y colocar su equivalente para hacer el barrido al mismo tiempo..
Espero que te sirva.
Salu2