x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 170

# Problem parsing a string.

Im parsing a string to add % signs after certain words
Basically if a word is in "double quotes" or 'single quotes' i treat it as a phrase and dont add % to the end
I add % to the end of all other words to make them wildcards for my search.
The problem is that this test string im using wont let me add a % to the last word,

Test string :  Lake ""turtle"" "dog" "cat" 'bat' bat bat12 bat:13 'bat'(horse:bite AND bird (goat OR whale)) NOT Fish
Proper Output:  Lake% ""turtle"" "dog" "cat" 'bat' bat% bat12% bat:13% 'bat'(horse:bite% AND bird% (goat% OR whale%)) NOT Fish%

Here is the code for my project:

Dim i As Integer
Dim SearchString, strNew As String
Dim strAlphaNumeric As String = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'()%*+-:" & Chr(34) & Chr(32)
Dim strChar As Char

SearchString = Me.Label1.Text

'strip out non_alphanumeric characters except for my special ones
For i = 1 To Len(SearchString)
strChar = Mid(SearchString, i, 1)
If InStr(strAlphaNumeric, strChar) Then
strNew = strNew + strChar
End If
Next

'add % after everyword that isnt in quotes that isnt AND OR NOT or in quotes
strChar = Nothing
For i = 1 To Len(strNew)
' skip AND, OR, NOT
If Mid(strNew, i, 3) = "AND" Then
i = i + 3

ElseIf Mid(strNew, i, 2) = "OR" Then
i = i + 2

ElseIf Mid(strNew, i, 3) = "NOT" Then
i = i + 3

ElseIf Mid(strNew, i, 1) Like ("[A-Z]") Or Mid(strNew, i, 1) Like ("[a-z]") Or Mid(strNew, i, 1) Like ("#") Then
'chr(40) = "("     chr(41) = ")"       chr(32) = " "
If Mid(strNew, i + 1, 1) = Chr(32) Or Mid(strNew, i + 1, 1) = Chr(40) Or Mid(strNew, i + 1, 1) = Chr(41) Then
strNew = strNew.Insert(i, "%")
i = i + 1
End If
End If

Next

Me.Label2.Text = strNew

0
bertino12
1 Solution

Commented:
Try

dim components() as string
dim s as string

componenets  = Split(Label1.Text, " ")

for each s in components
if not s.EndsWith(Chr(34)) AndAlso not s.EndsWith(Chr(xx)) Then    <--- replace xx with whatever it is for single quote
s = s & "%"
End If
Next

' now build it all back into one string
dim result as string
For each s in Components
result = result & " " & s
Next

MsgBox("Search string is : " & trim(result))

Excuse any typos as this has just been typed stright into here rather than via an editor :)

For each
0

Author Commented:
For i = 1 To Len(strNew)

I figured it out. The length of the string is changing as items are added to it. the original condition is stored as a constant and never reevaluated in VB .NET
So, I used a while loop and my code now works fine.
0

Commented:
Closed, 250 points refunded.
kb
Experts Exchange Moderator
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.