Assuming you don't want the user to enter a regular expression, you'll need to "escape" the text they've entered.
You'll also want to limit your search to items which actually match the specified text.
I've also assumed you want to match a literal question-mark after the entered text, rather than making the last character of the entered text optional.
string pattern = Regex.Escape(textBox2.Text) + @"\?(.*?)(?=\#|$)";
var matchingItems = listBox1.SelectedItems.OfType<object>()
.Select(i => i.ToString())
.Select(s => Regex.Match(s, pattern))
.Where(m => m.Success)
.Select(m => m.Groups[1].Value);
textBox1.Text = string.Join(Environment.NewLine, matchingItems);
NB: You should do yourself a favour, and stop accepting Visual Studio's default names for everything. Give your controls meaningful names - you'll thank yourself in six months when you come back to edit your code, and you don't have to spend ages working out what each control is supposed to represent! :)