Может быть:
^(?:\d(?=\d*\*?\d*(?:[ ,;]|$))[\d*]{0,9}(?:[ ,;]|$))+$
См. Онлайн демо
Поскольку вы хотите начинать число как минимум с одного di git, следующее будет match;
^
- начало строки ancor. (?:
- открыть 1-ю группу без захвата. \d
- сопоставить один di git. (?=
Открыть положительный просмотр вперед. \d*\*?\d*
- Любое количество цифр, необязательный подстановочный знак и снова любое количество цифр (чтобы разрешить только один подстановочный знак). (?:
- Открыть вложенный второй не захват группа. [ ,;]|$
- сопоставить любой из символов в классе символов или , затем конец строки. )
- закрыть второй группа без захвата.
)
- закрыть положительный просмотр вперед.
[\d*]{0,9}
- сопоставить символы 0-9 из класса символов (цифры или символы подстановки). (?:
- открыть 3-ю группу без захвата. [ ,;]|$
- сопоставить любой из символов в классе символов или , затем конец строки. )
- закрыть третий не захватывающая группа.
)
- закрыть 1-ю группу без захвата.
+
- повторить 1-ю группу без захвата хотя бы один раз. $
- Конечная строка ancor.
EDIT1 : Вышеупомянутое позволит использовать запятую, точку с запятой или пробел в конце. Если вы хотите избежать этого, вы можете использовать:
^(?:\d(?=\d*\*?\d*[ ,;])[\d*]{0,9}[ ,;])*\d(?=\d*\*?\d*$)[\d*]{0,9}$
См. Онлайн демонстрацию
EDIT2 : Вышеупомянутое позволяет использовать только один подстановочный знак на номер. Если ваше намерение было таково, что несколько должно быть разрешено (но просто не одно за другим, вы можете попробовать:
^(?:\d(?!.*\*\*.*[ ,;])[\d*]{0,9}[ ,;])*\d(?!.*\*\*.*$)[\d*]{0,9}$
См. Онлайн демонстрацию
EDIT3 : если по какой-то причине вы решите, что do хотите разрешить последовательные подстановочные знаки (но все равно начинайте хотя бы с одного di git), вы можете выбрать:
^(?:\d[\d*]{0,9}[ ,;])*\d[\d*]{0,9}$
Посмотреть онлайн демо