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

Java-Puzzle中的字符串正则表达式,java,regex,data-structures,Java,Regex,Data Structures,我有下面的字符串,其中包含多个日期;大概是这样的: 我出生于1965年8月11日。我需要将所有日期更改为不同的格式 实现这一目标的最佳优化方式是什么 注意: 我没有要求别人给我密码;只是征求意见;因此,我看不出负面评价的原因。如果我理解你的目标,我能想到的最简单的方法是使用两个实例。一个用于输入格式,一个用于输出格式。就是说,- String str = "8/11/1965"; DateFormat in = new SimpleDateFormat("dd/MM/yyyy"); DateFo

我有下面的字符串,其中包含多个日期;大概是这样的:

我出生于1965年8月11日。
我需要将所有日期更改为不同的格式

实现这一目标的最佳优化方式是什么

注意:


我没有要求别人给我密码;只是征求意见;因此,我看不出负面评价的原因。

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

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日是星期一而不是星期三)-


这是完整的算法

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() );
Pattern-ddpat=Pattern.compile(\\d{1,2}/\\d{1,2}/\\d{4})|(\\d{4}-\\d{2}-\\d{2});
DateFormat[]dddf=新的DateFormat[]{
新的简化格式(“日/月/年”),
新的SimpleDataFormat(“yyyy-MM-dd”)};
DateFormat wwdf=新的SimpleDataFormat(“EEEE,MMMM d yyyy”);
String s=“我出生于1965年11月18日,并于1978年10月9日毕业,依此类推”;
StringBuilder sb=新的StringBuilder();
匹配器ddmat=ddpat.匹配器;
整数偏移=0;
while(ddmat.find(offset)){

对于(int-ig=1;ig您的猜测是错误的,请使用日期解析模块。如果日期的格式未知,这将是不可能的。您打算如何处理12/12/12?使用正则表达式以典型格式获取日期,并使用日期格式化程序对其进行解析和格式化是可能的。@user182944我认为否决票是因为没有显示您的日期尝试并没有完成您的问题,使其成为对未来读者有用的问题。正在StackOverflow中搜索“java日期格式”返回数千个点击率;可能是投票失败的原因。无论如何,请阅读我在上面评论中发布的重复问题的答案。关注和,因为旧的java.util.Date和.Calendar类对你的心理健康有害。几乎不需要正则表达式,因为这两个优秀的日期时间库可以帮你完成繁重的工作。正则表达式ld仅用于从文本中提取日期,并将其替换为格式化日期。Joda Time和java.Time不会为您解析英语句子中的日期,也不会进行替换。我只是看到我使用了“d”而不是“dd”。这是因为我在口头化日期中找到了月份的前导零“官僚主义风格”。YMMV。感谢您提供的示例代码。我计划在正则表达式中使用OR,即,
|
和一系列日期模式。这是个好主意吗?有什么帮助吗?@user182944不是“| |”,但您可以使用”|"。您必须尝试使用多种日期格式进行转换。使用单独的组可能会告诉您格式,然后您就知道日期格式。不,知道日期格式是不可能的,因此您需要尝试找出不同的选项。除了使用
之外,您是否可以建议其他替代方法?@user182944组成您的团队注意!你可能知道很多可能的格式,也可能不知道。如果你知道正则表达式模式,你就知道日期格式。--请参阅更新的答案。谢谢你的回复。格式部分对我来说很好,导致问题的部分是
字符串中包含不同类型的日期格式。如何处理?请建议已经有一个你的问题仍然不清楚如何以多种格式识别日期……这是一个模棱两可的尝试。
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() );