Just modifying your original rule a bit
edit Ok, removing delimiters as suggested.
RuleFor(m => m.UserName).NotEmpty().Length(3, 15).Matches(@"\A\S+\z");
All it does is force there to be non-whitespace in the whole string from start to finish.
Alternatively, I guess you could combine them into 1 match as in
RuleFor(m => m.UserName).Matches(@"\A\S{3,15}\z");