use strict; use warnings; while(){ s/^(\d{2,4})(\D)(\d{2})(\D)(\d{4}|\d{2})/ ( length $1 > 2 ? 'YYYY' : 'DD' ) ."$2MM$4" .( length $5 > 2 ? length $1 <= 2 ? 'YYYY' : 'RR' : 'DD' )/ex; print; } __DATA__ 99/99/9999 99/99/99 99-99-9999 99-99-99 99:99:9999 99:99:99 99+99+9999 9999-99-99 9999:99:99 9999+99+99