Сделать разделители необязательными, кодируя ?
после класса символов:
\b(4\d{3}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4})\b
См. живая демонстрация .
Я добавил границы слов \b
с обоих концов он не совпадает, например, с первыми 16 цифрами 40001111222233338.
кстати, вы можете кодировать его более кратко, повторяя [\s-]?\d{4}
3 раза, например:
\b(4\d{3}([\s-]?\d{4}){3})\b