There are 2 things going on here.
The first is that the alternation operator has a very low precedence. This means that:
\s*\bStreet|Expy\b\s*
(which is a very cut down version of your pattern) will match 2 alternatives namely '\s*\bStreet' and 'Expy\b\s*'. I suspect that you want the '\s*\b' at the start and the '\b\s*' at the end to apply to all of the alternatives in between. In that case you need to specify this as
\s*\b(Street|Expy)\b\s*
(obviously with all of the other alternatives added).
The second issue is why the pattern is matching the test string. If you look at what is actually being matched you will see that it is the characters "st". Given what I said before, the "|St|" alternative is being seen by the regex engine as being the ONLY characters that are needed for this alternative to match. The way the regex engine works is to set a pointer to the start of the text and then try to see if the pattern can match starting from that point.
If it fails (as it will with your test string) the regex engine then advances the text pointer 1 step and tries the pattern again. This is repeated until either a match is made or the text pointer gets to the end of the string.
What is happening is that the text pointer is pointing to the "s" character in "destination" and the pattern is then trying each alternative in turn until it gets to the '|St|' one. As you have the "ignore case" option set, it will declare a match.
If you make the change I mentioned to the first problem, then this one will go away (i.e. the '\b' anchors will be applied to the start and end of each option and so will only match a complete "word" and therefore will not match the "st" characters within a word.
Susan