Короче говоря, это не так, это то, что ваше регулярное выражение неверно. Вы используете квадратные скобки, которые описывают класс символов (один символ). В вашем случае, НЕ открытый парен или A или P или T и т. Д.
Попробуйте, это возвращает 2-ю группу, которая следует за последним вхождением строки, заканчивающейся пробелом, затем группой либо «APT», либо знаком фунта, затем другим пробелом, затем чем-нибудь до конца строки (захватывая «что-нибудь» " в группе). Другими словами, сохраните все после последнего APT или # и считайте, что APT:
WITH DATA(id, str) AS (
SELECT 1, '437 E MERRIMACK ST APT 14' FROM dual UNION ALL
SELECT 2, '29 MARIAN RD # B' FROM dual UNION ALL
SELECT 3, '29 MARIAN RD' FROM dual UNION ALL
SELECT 4, '29 MARIAN ST' FROM dual UNION ALL
SELECT 5, '104 BEECH ST # 1L' FROM dual UNION ALL
SELECT 6, 'w32 IRVING RD APT M' FROM dual UNION ALL
SELECT 7, 'w32 IRVING RD # L' FROM dual UNION ALL
SELECT 8, 'w32 IRVING AVE' FROM dual UNION ALL
SELECT 9, '288 N MAIN ST APT 1-4' FROM dual
)
SELECT id, str,
REGEXP_SUBSTR(str, '^.* (APT|#) (.*)$', 1, 1, null, 2) APT
FROM data;
ID STR APT
---------- ------------------------- -------------------------
1 437 E MERRIMACK ST APT 14 14
2 29 MARIAN RD # B B
3 29 MARIAN RD
4 29 MARIAN ST
5 104 BEECH ST # 1L 1L
6 w32 IRVING RD APT M M
7 w32 IRVING RD # L L
8 w32 IRVING AVE
9 288 N MAIN ST APT 1-4 1-4
9 rows selected.