This seems to match the rules I have defined, but I only starting learning regex tonight, so I am wondering if it is correct.
Rules:
Using the POSIX character class for alphanumeric characters to make it work for accented and other foreign alphabetic characters:
/^[[:alnum:]]+([-_ ]?[[:alnum:]])*$/
More efficient (prevents captures):
/^[[:alnum:]]+(?:[-_ ]?[[:alnum:]]+)*$/
These also prevent sequences of more than one space/hyphen/underscore in combination. It doesn't follow from your specification whether that is desirable, but your own regex seems to indicate this is what you want.