Вы не можете вложить такие классы символов таким образом.
Если вы всегда знаете, что получаете класс символов, проще всего было бы обрезать входную строку его скобок:
public Pattern negate(Pattern p) {
return Pattern.compile("[^" + p.pattern().substring(1));
}
Более надежный метод - анализировать входные данные с регулярными выражениями ...:)