Java中的字符串正则表达式 - 拼图

时间:2014-07-30 15:18:13

标签: java regex data-structures

我有以下字符串,其中包含多个日期;像这样的东西:

I was born on 8/11/1965.我需要将所有日期更改为其他格式。

实现这一目标的最佳方法是什么?

注意:

我没有让别人给我代码;只是征求意见;因此无法看出任何负面评价的原因。

2 个答案:

答案 0 :(得分:2)

这是完整的算法。

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() );

要处理99/99/9999和类似,请在dddf.parse(dd)之后处理ParseException并替换为您认为合适的任何内容。不匹配正则表达式的字符串是没有希望的,除非你能想到匹配“假日期”的正则表达式。 ; - )

<强>后来

如果你想钓几种格式:

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() );

答案 1 :(得分:1)

如果我了解您的目标,我能想到的最简单的方法是使用两个SimpleDateFormat个实例。一个用于输入格式,一个用于输出格式。就是这样的 -

String str = "8/11/1965";
DateFormat in = new SimpleDateFormat("dd/MM/yyyy");
DateFormat out = new SimpleDateFormat("EEEE, MMMM dd yyyy");
System.out.println(out.format(in.parse(str)));

输出是(因为1965年11月8日是星期一星期三) -

Monday, November 08 1965

$ cal 11 1965
   November 1965      
Su Mo Tu We Th Fr Sa  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29 30