Для захвата всех номеров, кроме 33333, используйте этот код:
String zip = "11111 22222 33333- 44444-4444";
String regex = "\\d{5}(?=(-\\d{4}|\\s|$))(-\\d{4})?";
Matcher m = Pattern.compile(regex).matcher(zip);
while(m.find())
System.out.printf("Macthed: [%s]%n", m.group(1));
ВЫВОД:
Macthed: [11111]
Macthed: [22222]
Macthed: [44444-4444]
Объяснение: Этот RegEx использует предпросмотр, который сам по себе похож на условие, что означает совпадение 5-значного числа, за которым должно следовать - и 4-х цифр ИЛИ пробел ИЛИ конец строки, а затем это необязательно соответствие текста - и 4 цифры.
Причина, по которой ваш исходный RegEx вызывает исключение из-за синтаксической ошибки в ?:(?=-)
части вашего RegEx.