Вы можете попробовать это:
[ ]((?:3[01]|[12][0-9]|0?[1-9])([\-/.])(1[1-2]|0?[1-9]))(?:$|[^\d\-/.])
Я предполагаю, что вам нужны разные группы захвата, которые вы использовали в своем вопросе. Если это не так, вы можете удалить их или заменить их на группы без захвата (?:)
Я также предполагаю, что вам не нужно захватывать пространство на группе захвата, поэтому я помещаю его в сторону.
Итак, основная идея c заключается в том, что перед вашим выражением вы можете захотеть найти либо конец строки / строки $
, либо какой-либо символ, который не является числом, -
, /
или .
.