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