This is the complete algorithm.
Pattern ddpat = Pattern.compile( "\\d{1,2}/\\d{1,2}/\\d{4}" );
DateFormat dddf = new SimpleDateFormat("dd/MM/yyyy");
DateFormat wwdf = new SimpleDateFormat("EEEE, MMMM d yyyy");
String s = "I was born on 18/11/1965. and completed my grad on 9/10/1978 and so on";
StringBuilder sb = new StringBuilder();
Matcher ddmat = ddpat.matcher( s );
int offset = 0;
while( ddmat.find( offset ) ){
int beg = ddmat.start();
int end = ddmat.end();
String dd = s.substring( beg, end );
String ww = wwdf.format( dddf.parse( dd ) );
sb.append( s.substring( offset, beg ) ).append( ww );
offset = end;
}
sb.append( s.substring( offset ) );
System.out.println( sb.toString() );
To handle 99/99/9999 and similar, handle ParseException after dddf.parse( dd ) and replace with whatever you seem fit. Strings not matching the regex are hopeless, unless you can think of a regex matching "false dates". ;-)
Later
If you want to fish for several formats:
Pattern ddpat = Pattern.compile( "(\\d{1,2}/\\d{1,2}/\\d{4})|(\\d{4}-\\d{2}-\\d{2})" );
DateFormat[] dddf = new DateFormat[]{
new SimpleDateFormat("dd/MM/yyyy"),
new SimpleDateFormat("yyyy-MM-dd") };
DateFormat wwdf = new SimpleDateFormat("EEEE, MMMM d yyyy");
String s = "I was born on 18/11/1965. and completed my grad on 1978-10-09 and so on";
StringBuilder sb = new StringBuilder();
Matcher ddmat = ddpat.matcher( s );
int offset = 0;
while( ddmat.find( offset ) ){
for( int ig = 1; ig <= ddmat.groupCount(); ig++ ){
if( ddmat.group(ig) != null ){
int beg = ddmat.start(ig);
int end = ddmat.end(ig);
String dd = s.substring( beg, end );
String ww = wwdf.format( dddf[ig-1].parse( dd ) );
sb.append( s.substring( offset, beg ) ).append( ww );
offset = end;
break;
}
}
}
sb.append( s.substring( offset ) );
System.out.println( sb.toString() );