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替换方法。我以为你指的是原始字符串。不显式调用任何字符串方法是一个挑战吗?或者你只想用一个正则表达式匹配就可以了。如果是后者,你不可能在这样的一场比赛中跳起来。