I assume you talk mean that their can be only one group of special caracters, the following statement should do the trick:
^[a-zA-Z0-9][a-zA-Z0-9 ]*[-#.]*[a-zA-Z0-9 ]*
I'll break it down:
^[a-zA-Z0-9]
means it must start with one alphanumeric character
[a-zA-Z0-9 ]*
means there might be following alphanumeric characters
[-#.]*
means somewhere in the string, there can be a sequence of special characters
[a-zA-Z0-9 ]*
means string might end with a sequence of alphanumeric characters or special characters
The first and second part are close but different to prevent a space to be placed at the beginning.
The fact of wrapping the special characters sequence the same structure with *
allows it to be anywhere.
Some references