Если сначала поставить -
, он не будет интерпретироваться как индикатор диапазона.
^([-a-zA-Z0-9_])+|~$
Это соответствует всем вашим примерам, кроме последнего с использованием следующего кода:
String str = "A8ft-y6hDu ~";
System.out.println("Result: " + str.matches("^([-a-zA-Z0-9_])+|~$"));
Последний пример не подходит, потому что он не подходит под ваше описание. Регулярное выражение будет соответствовать любой комбинации буквенно-цифровых символов, - и _, ИЛИ символа ~.