Hmmm, this application has changed a bit since my original contribution. Having to figure out exactly what it is supposed to do is the majority of the work I would say. I have been stepping through CompareString and CompareWord methods, and I believe I have been misunderstanding what you are doing all along.
First, let me say your search code is very interesting. However, your program has little or no embedded comments explaining how the FormSearcher class is supposed to work, so I need you to verify my understanding before I continue further because I don't want to waste any more time proceeding down a falsely assumed path...
As I understand it, and you need to make sure I haven't missed anything, this is how you are determining whether the given string is enough of a match to constitute the form item being displayed:
Regarding user supplied string:
1) words to compare are whitespace delimited and must be at least 2 chars in length
1a) correction (see SPLIT comment below) : there is always only one word with whitespace removed!!!
For each word (loop) against the complete form's string:
2) each word is compared to the form's string by finding the location in the form's string where the 1st character of the word is found
3) you then remove that character from the form's string and beginning again with the 2nd character of the word
4) each found word character gets a match count increment
5) thus, you are counting the first instance of each character from the word found in the form's string
6) then, determining what percent of the word based on the percentage of the word's length the form's string length is a match; if that percent is >= 75%, you count that as a matched word
OK, I've been editing this and testing as I go along and as far as I can figure, the "word" is all of the text entered by the user because you have told it to ignore whitespace when splitting the text into an array, so the array has only one item or word... So, I gather you are using that to remove spaces and when you compare length < 2 that is for the entire string length because there always only one word the way I see it... So you are not really matching words at all, but a percent of characters existing in the string in any order? CONFIRM, CONFIRM, CONFIRM...
Anyway, here are some of the results I got and you should confirm these are expected:
Therefore, if user enters "69 ^ 2 E v 2 /a l u + 8 / a t e 3 + 5 / 2 ( 6 \ 9 + 6 ) .", this will match Form3 ("Evaluate2/3+5/6+8/9^22(6\9+6)."), which has a picture of a suitcase or something. Is that how it is supposed to work?
Also, you have a backslash in: "Evaluate2/3+5/6+8/9^22(6\9+6)." Is that intended?