buenas...
en teoría, se supone que el patrón
[^A-Za-z0-9\-\_] es correcto. posiblemente fue el modo en que lo utilizastes.
Código:
var regexp = /[^A-Za-z0-9\-\_]/g;
console.log(regexp.test('1de2')); // false, validó bien ;
console.log(regexp.test('1-2')); // false ;
console.log(regexp.test('1@2')); // true, violación al patrón ;
básicamente el patrón significa "si encuentra cualquier cosa no indicada en esta lista o rango, entonces no valida".