Java正则表达式从字符串中检索日期

Java正则表达式从字符串中检索日期,java,regex,Java,Regex,我有以下字符串输入: 2015年3月4日至10月31日 2015年10月24日 在这两种情况下,我都需要使用格式dd-MMM-yyyy 在上述示例中,预期结果应为: 2015年3月4日 2015年10月24日 我尝试了以下操作:^[\d]{1,2}\s[\w]{3}\s(?=到[\w]{3})?[\d]{4} 我甚至不确定正则表达式是否可以跳过单词,一次运行就能得到相关的结果 约束:我不想(不能)使用字符串方法(如conncate、split等)或正则表达式替换方法 (\d{1,2} )(\w{

我有以下字符串输入:

2015年3月4日至10月31日

2015年10月24日

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

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

2015年3月4日

2015年10月24日

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

我甚至不确定正则表达式是否可以跳过单词,一次运行就能得到相关的结果

约束:我不想(不能)使用字符串方法(如conncate、split等)或正则表达式替换方法

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

现在连接三个匹配的组。

@ndn答案是正确的,在用括号捕获组后,您只需以类似的方式遍历匹配器组

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

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

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


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

日期所需的所有内容:

/**
 * 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 "";
}
/**
*使用器parseFrValid(字符串dateFr)
*@param-dateFr
*@返回
*@InvalidException
*/
公共静态日期分析器(字符串日期分析器){
日期=空;
if(dateFr!=null){
dateFr=dateFr.trim();
字符串[]日期=dateFr.split(“/”);
int-jour=1;
int mois=1;
int ANNE=1900;
如果(dates.length==3){
jour=新整数(日期[0])。intValue();
mois=新整数(日期[1])。intValue()-1;
annee=新整数(日期[2])。intValue();
如果(安尼=30和安尼31){
投掷(新的伤残例外(“正确”);
}
如果(mois<0 | | mois>11){
投掷(新的残疾例外(“Le mois saisi n'est pas correct”);
}
如果(安尼=30和安尼2050){
投掷(新的伤残例外(“L'année n'est pas correction”);
}                 
GregorianCalendar gc=新的GregorianCalendar(Locale.FRENCH);
gc.set(安尼、莫伊斯、焦耳);
date=gc.getTime();
}否则如果(dates.length>2){
投掷(新的伤残例外(“La date doitêtre au格式MM/AAAA”);
}
}
返回日期;
}
公共静态日期mmaaavalid(字符串dateMMAAAA){
日期=空;
如果(dateMMAAAA!=null){
dateMMAAAA=dateMMAAAA.trim();
字符串[]dates=dateMMAAAA.split(“/”);
int-jour=1;
int mois=1;
int ANNE=1900;
如果(dates.length==2){
mois=新整数(日期[0])。intValue()-1;
annee=新整数(日期[1])。intValue();
如果(焦耳<1 | |焦耳>31){
返回null;
}
如果(mois<0 | | mois>11){
返回null;
}
if(安尼=30和安尼2050 | |安尼<1900){
返回null;
}
GregorianCalendar gc=新的GregorianCalendar(Locale.FRENCH);
gc.set(安尼、莫伊斯、焦耳);
date=gc.getTime();
}否则如果(dates.length>2){
返回null;
}
}
返回日期;
}
公共静态日期jjmmaavalide(字符串dateFr){
日期=空;
if(dateFr!=null){
dateFr=dateFr.trim();
字符串[]日期=dateFr.split(“/”);
int-jour=1;
int mois=1;
int ANNE=1900;
如果(dates.length==3){
jour=新整数(日期[0])。intValue();
mois=新整数(日期[1])。intValue()-1;
annee=新整数(日期[2])。intValue();
如果(焦耳<1 | |焦耳>31){
返回null;
}
如果(mois<0 | | mois>11){
返回null;
}
if(安尼=30和安尼2050 | |安尼<1900){
返回null;
}                 
GregorianCalendar gc=新的GregorianCalendar(Locale.FRENCH);
gc.set(安尼、莫伊斯、焦耳);
date=gc.getTime();
}否则如果(dates.length>3){
返回null;
}
}
返回日期;
}
公共静态字符串tonomficher(日期){
如果(日期!=null){
SimpleDataFormat格式化程序
=新的简化格式(“dd-MM-yyyy”);
返回格式化程序。格式(日期);
}
否则返回“”;
}
公共静态字符串到字符串模式(日期d,字符串模式){
如果(d!=null){
SimpleDataFormat格式化程序=新的SimpleDataFormat(模式);
返回格式化程序。格式(d);
}
返回“”;
}
公共静态字符串ToString(日期){
如果(日期!=null){
SimpleDataFormat格式化程序
=新的简化格式(“dd/MM/yyyy”);
返回格式化程序。格式(日期);
}
否则返回“”;
}

您可以使用什么?正则表达式不能匹配不连续的文本,这就是为什么正则表达式类中有特定的函数/方法。这就是我所怀疑的。谢谢你为我澄清这一点。那么我建议删除这个问题,因为它无法回答,或者修改它,以便你可以接受下面的任何答案。@GilPeretz,但你不想使用任何正则表达式方法,或者只是替换?这个问题应该很接近。请投票。约束:我不想(不能)使用字符串方法(如conncate、split等)或regex替换方法。我以为你指的是原始字符串。不显式调用任何字符串方法是一个挑战吗?或者你只想用一个正则表达式匹配就可以了。如果是后者,你不可能在这样的一场比赛中跳起来。