^\w++(?:[.\s-](?![.\s-])|\w++)*$
делает это (удваивает обратную косую черту для использования в строке Java).
Объяснение:
^ # Start of string
\w++ # Match one or more alnum characters, possessively
(?: # Match either
[.\s-] # a single "special" character
(?![.\s-]) # aserting that it's really single
| # or
\w++ # one or more alnum characters, possessively
)* # zero or more times
$ # End of string
Собственные квантификаторы (++
) помочь регулярному выражению не работать быстрее, если строка не совпадает.