Java Regex从字符串中检索日期

时间:2015-08-04 07:45:54

标签: java regex

我有以下字符串输入:

4 Mar to 31 Oct 2015

24 Oct 2015

在这两种情况下,我都需要使用格式dd MMM yyyy

提取第一个日期

在上面的示例中,预期结果应为:

4 Mar 2015

24 Oct 2015

我尝试了以下内容:^[\d]{1,2}\s[\w]{3}\s(?=to [\w]{3})?[\d]{4}

我甚至不确定正则表达式可以跳过单词并获得单次运行的相关结果。

约束:我不想(不能)使用String方法(即conncate,split等),也不想使用正则表达式替换方法。

4 个答案:

答案 0 :(得分:1)

(\d{1,2} )(\w{3} )(?:.(?!\d{4}))*.?(\d{4})

现在连接三个匹配的组。

答案 1 :(得分:0)

@ndn答案是正确的,在用括号捕获组后,你只需要遍历匹配器类似于此的

if (m.matches()) 
{
 int day   = Integer.parseInt(m.group(1));
 String month = m.group(2);
 int year  = Integer.parseInt(m.group(3));
}

答案 2 :(得分:0)

我认为你需要使用这样的正则表达式:

(\d{1,2}).*?(Mar|Oct).*(\d{4})

替换$1 $2 $3

[Regex Demo]

您需要更具体地说明月份名称。

答案 3 :(得分:0)

日期所需的一切:

/**
 * utiliser parseFrValid(String dateFr)
 * @param dateFr
 * @return
 * @throws InvalidException 
 */
public static Date parseFr(String dateFr){
    Date date = null;
    if (dateFr !=null){
        dateFr = dateFr.trim();
        String[] dates = dateFr.split("/");
        int jour = 1;
        int mois = 1;
        int annee = 1900;
        if (dates.length == 3){
            jour = new Integer(dates[0]).intValue();
            mois = new Integer(dates[1]).intValue()-1;
            annee = new Integer(dates[2]).intValue();

            if (annee<30)
                annee+=2000;
            else if (annee>=30 && annee <1900)
                annee+=1900;         


            GregorianCalendar gc = new GregorianCalendar(Locale.FRENCH);     
            gc.set(annee, mois, jour);
            date = gc.getTime();

        }
    }
    return date;

}
/**
 * retrourne une date pour une date string au format jj/MM/yyyy
 * @param dateFr
 * @return
 * @throws InvalidException 
 */
public static Date parseFrRazSlash(String dateFr) throws InvalidException{
    if(DateUtils.testDate(dateFr))
     return RazDateHeure(parseFr(dateFr));
    else
        throw(new InvalidException("La date est invalide"));
}


public static Date getDateDebut(Date date) {
    if(date==null) {
        return null;
    }
    return RazDateHeure(date);
}

public static Date getDateFin(Date date) {
    if(date!=null) {
        GregorianCalendar gc = new GregorianCalendar();         
        gc.setTime(date);
        gc.add(Calendar.DAY_OF_YEAR, +1);
        gc.add(Calendar.SECOND, -1);
        return gc.getTime();
    }
    return null;
}

/**
 * utiliser parseFrValid(String dateFr)
 * @param dateFr
 * @return
 */
public static Date parseFr2(String dateFr){
    Date date = null;

    if (dateFr !=null){
        dateFr = dateFr.trim();
        String[] dates = dateFr.split("-");
        int jour = 1;
        int mois = 1;
        int annee = 1900;
        if (dates.length == 3){
            jour = new Integer(dates[0]).intValue();
            mois = new Integer(dates[1]).intValue()-1;
            annee = new Integer(dates[2]).intValue();

            if (annee<30)
                annee+=2000;
            else if (annee>=30 && annee <1900)
                annee+=1900;         


            GregorianCalendar gc = new GregorianCalendar(Locale.FRENCH);     
            gc.set(annee, mois, jour);
            date = gc.getTime();

        }
    }
    return date;
}
/**
 * utiliser parseFrValid(String dateFr)
 * @param dateFr de la forme aaaa-mm-jj
 * @return
 */
public static Date parseFr3(String dateFr){
    Date date = null;
    if (dateFr !=null){
        dateFr = dateFr.trim();
        String[] dates = dateFr.split("-");
        int jour = 1;
        int mois = 1;
        int annee = 1900;
        if (dates.length == 3){
            jour = new Integer(dates[2]).intValue();
            mois = new Integer(dates[1]).intValue()-1;
            annee = new Integer(dates[0]).intValue();

            if (annee<30)
                annee+=2000;
            else if (annee>=30 && annee <1900)
                annee+=1900;         


            GregorianCalendar gc = new GregorianCalendar(Locale.FRENCH);     
            gc.set(annee, mois, jour);
            date = gc.getTime();

        }
    }
    return RazDateHeure(date);
}

/**
 * 
 * @param sqlDate
 * @return
 */
public static Date getDateFromSqlString(String sqlDate) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
    try
    {
        Date date = sdf.parse(sqlDate);
        return date;
    }
    catch(Exception e) 
    {
        return null;
    }
}

/**
 * 
 * @param dateFr
 * @return
 * @throws InvalidException
 */
public static Date parseFrValid(String dateFr) throws InvalidException{
    Date date = null;
    if (dateFr !=null && !dateFr.equals("")){
        dateFr = dateFr.trim();
        String[] dates = dateFr.split("/");
        int jour = 1;
        int mois = 1;
        int annee = 1900;
        if (dates.length == 3){
            jour = new Integer(dates[0]).intValue();
            mois = new Integer(dates[1]).intValue()-1;
            annee = new Integer(dates[2]).intValue();
            if (jour < 1 || jour >31){
                throw(new InvalidException("Le jour saisi n'est pas correct"));
            }
            if (mois < 0 || mois >11){
                throw(new InvalidException("Le mois saisi n'est pas correct"));
            }

            if (annee<30)
                annee+=2000;
            else if (annee>=30 && annee <1900)
                annee+=1900;         

            if (annee > 2050){
                throw(new InvalidException("L'année n'est pas correcte."));
            }                 

            GregorianCalendar gc = new GregorianCalendar(Locale.FRENCH);     
            gc.set(annee, mois, jour);
            date = gc.getTime();

        }
    }
    return date;
}

/**
 * permet transformer une date en date valide
 * @param date
 * @return
 * @throws InvalidException
 */
public static Date parseFrValid(Date date) throws InvalidException{
    return parseFr(toStringJson(date));
}

public static Date parseFrMMAAAAValid(String dateMMAAAA) throws InvalidException{
    Date date = null;
    if (dateMMAAAA !=null){
        dateMMAAAA = dateMMAAAA.trim();
        String[] dates = dateMMAAAA.split("/");
        int jour = 1;
        int mois = 1;
        int annee = 1900;
        if (dates.length == 2){
            mois = new Integer(dates[0]).intValue()-1;
            annee = new Integer(dates[1]).intValue();
            if (jour < 1 || jour >31){
                throw(new InvalidException("Le jour saisi n'est pas correct"));
            }
            if (mois < 0 || mois >11){
                throw(new InvalidException("Le mois saisi n'est pas correct"));
            }

            if (annee<30)
                annee+=2000;
            else if (annee>=30 && annee <1900)
                annee+=1900;         

            if (annee > 2050){
                throw(new InvalidException("L'année n'est pas correcte."));
            }                 

            GregorianCalendar gc = new GregorianCalendar(Locale.FRENCH);     
            gc.set(annee, mois, jour);
            date = gc.getTime();

        }else if (dates.length > 2){
            throw(new InvalidException("La date doit être au format MM/AAAA"));
        }
    }
    return date;
}


public static Date MMAAAAValid(String dateMMAAAA) {
    Date date = null;
    if (dateMMAAAA !=null){
        dateMMAAAA = dateMMAAAA.trim();
        String[] dates = dateMMAAAA.split("/");
        int jour = 1;
        int mois = 1;
        int annee = 1900;
        if (dates.length == 2){
            mois = new Integer(dates[0]).intValue()-1;
            annee = new Integer(dates[1]).intValue();
            if (jour < 1 || jour >31){
                return null;
            }
            if (mois < 0 || mois >11){
                return null;
            }

            if (annee<30)
                annee+=2000;
            else if (annee>=30 && annee <1900)
                annee+=1900;         

            if (annee > 2050 || annee < 1900 ){
                return null;
            }
            GregorianCalendar gc = new GregorianCalendar(Locale.FRENCH);     
            gc.set(annee, mois, jour);
            date = gc.getTime();

        }else if (dates.length > 2){
            return null;
        }
    }
    return date;
}

public static Date JJMMAAAValide(String dateFr) {
    Date date = null;
    if (dateFr !=null){
        dateFr = dateFr.trim();
        String[] dates = dateFr.split("/");
        int jour = 1;
        int mois = 1;
        int annee = 1900;
        if (dates.length == 3){
            jour = new Integer(dates[0]).intValue();
            mois = new Integer(dates[1]).intValue()-1;
            annee = new Integer(dates[2]).intValue();
            if (jour < 1 || jour >31){
                return null;
            }
            if (mois < 0 || mois >11){
                return null;
            }

            if (annee<30)
                annee+=2000;
            else if (annee>=30 && annee <1900)
                annee+=1900;         

            if (annee > 2050 || annee < 1900 ){
                return null;
            }                 

            GregorianCalendar gc = new GregorianCalendar(Locale.FRENCH);     
            gc.set(annee, mois, jour);
            date = gc.getTime();

        }else if (dates.length > 3){
            return null;
        }
    }
    return date;
}

public static String toNomFichier(Date date){
     if (date!=null){
         SimpleDateFormat formatter
             = new SimpleDateFormat ("dd-MM-yyyy");         
         return formatter.format(date);
     }
     else return "";
}

public static String toStringPattern(Date d, String pattern){
    if(d!=null){
        SimpleDateFormat formatter = new SimpleDateFormat (pattern);         
        return formatter.format(d);
    }
    return "";
}

public static String toStringJson(Date date){
     if (date!=null){
         SimpleDateFormat formatter
             = new SimpleDateFormat ("dd/MM/yyyy");         
         return formatter.format(date);
     }
     else return "";
}