use strict; use warnings; my $fmt; print map { sprintf qq{Date: %-12sFormat: %-s\n}, $_->[0], $_->[1] } map { m {(?x) ^ (?(?=\d\d(\D)\d\d(\D)\d{4}$) (?{$fmt = qq{DD${1}MM${2}YYYY}}) | (?(?=\d{4}(\D)\d\d(\D)\d\d$) (?{$fmt = qq{YYYY${3}MM${4}DD}}) | (?(?=\d\d(\D)\d\d(\D)\d\d$) (?{$fmt = qq{DD${5}MM${6}RR}}) | (?{$fmt = q{Date not valid}}) ) ) ) }; [$_, $fmt]; } map {chomp; $_;} ; __END__ 99/99/9999 99/99/99 99-99-9999 99-99-99 99-99 99-99-999 99:99:9999 99:99:99 99+99+9999 9999-99-99 9999:99:99 9/99/99 9999+99+99 99-99.9999 99.99-9999