Tu étais proche.
^[0-9]{4}(?:,[0-9]{4})*,?$
Cela correspondra à toute chaîne constituée d'une séquence répétitive de chiffres à 4 chiffres et de virgules.
En ^
y $
correspondent respectivement au début et à la fin de la chaîne. Ainsi, elle ne correspondra que si la chaîne est composée de uniquement ces éléments.
En (?:)
est un groupe de non-capture. Il vous permet de créer des groupes répétitifs sans les stocker tous dans des variables.
EDITAR: J'ai oublié la virgule facultative à la fin. J'ai ajouté un ,?
pour s'en occuper.
EDIT 2 : Sur les conseils de FailedDev, voici mon idée originale. Elle fonctionne aussi, mais je pense qu'elle est plus difficile à comprendre. Elle est plus intelligente, mais ce n'est pas toujours une bonne chose.
^(:?[0-9]{4}(?:,|$))+$