Ну, простейшее регулярное выражение, вероятно, будет:
(\d{1,3}\.\d{1,3}\.\d{1,3})(:\d+)?
Но ... это позволило бы такие вещи, как 999.999.999
, который не является действительным (формат действителен, но не значения) IP адрес.
Если вы хотите проверить каждый блок, лучше всего делать это вне регулярного выражения.