Java 如何在字符串中搜索可解析的日期

Java 如何在字符串中搜索可解析的日期,java,regex,date,Java,Regex,Date,我有一些字符串可能包含也可能不包含要解析的日期(例如,类(自Java8)或 例如: 搜索格式为yymdd HH mm ss 在字符串中,这发生在:14032712-08-12,是的。 日期的格式可能会有所不同,因此我无法使用预定义的正则表达式 在字符串中搜索日期的最佳方法是什么? 例如,是否可以从DateTimeFormatter获取正则表达式 我唯一的想法是计算y,M,d等等,为它创建一个正则表达式,但它看起来像我上面的例子一样丑陋 编辑: 日期解析类现在已精确到上面 但确切的解析器并不那么重

我有一些字符串可能包含也可能不包含要解析的日期(例如,类(自Java8)或

例如:

搜索格式为
yymdd HH mm ss
在字符串
中,这发生在:14032712-08-12,是的。

日期的格式可能会有所不同,因此我无法使用预定义的正则表达式

在字符串中搜索日期的最佳方法是什么? 例如,是否可以从DateTimeFormatter获取正则表达式

我唯一的想法是计算
y
M
d
等等,为它创建一个正则表达式,但它看起来像我上面的例子一样丑陋

编辑:

日期解析类现在已精确到上面

但确切的解析器并不那么重要: 我需要一对日期解析器模式和正则表达式模式来搜索字符串中的日期,而不是解析找到的字符串

解析器模式使用的确切语法也不那么重要,它可以使用上面示例中的另一种语法

我不知道编译时的确切日期格式。用户将输入日期格式模式(如
yyMMdd HH mm ss
),然后我必须在字符串中搜索具有此模式的日期。(我可以编写一个自己的函数将日期格式模式转换为正则表达式模式,但是……可能已经存在了吗?

Description 您只提供了一种日期格式

([0-9]{2})([0-9]{2})([0-9]{2})\s+([0-9]{2})-([0-9]{2})-([0-9]{2})

此表达式将:

  • yyMMdd hh mm ss
  • 在各自的捕获组中捕获每个日期值
    • 组0获取整个日期时间
    • 第一组获得年度冠军
    • 第二组得到月份
    • 第三组有一天
    • 第四组得到时间
    • 第五组有发言权
    • 第六组获得第二名
例子 现场演示

示例文本

示例:在字符串“This was happendat:140327 12-08-12,yeah”中搜索格式为“yyMMdd HH mm ss”的日期

样本匹配

MATCH 1
0.  [95-110]    `140327 12-08-12`
1.  [95-97]     `14`
2.  [97-99]     `03`
3.  [99-101]    `27`
4.  [102-104]   `12`
5.  [105-107]   `08`
6.  [108-110]   `12`
解释 描述 您只提供了一种日期格式

([0-9]{2})([0-9]{2})([0-9]{2})\s+([0-9]{2})-([0-9]{2})-([0-9]{2})

此表达式将:

  • yyMMdd hh mm ss
  • 在各自的捕获组中捕获每个日期值
    • 组0获取整个日期时间
    • 第一组获得年度冠军
    • 第二组得到月份
    • 第三组有一天
    • 第四组得到时间
    • 第五组有发言权
    • 第六组获得第二名
例子 现场演示

示例文本

示例:在字符串“This was happendat:140327 12-08-12,yeah”中搜索格式为“yyMMdd HH mm ss”的日期

样本匹配

MATCH 1
0.  [95-110]    `140327 12-08-12`
1.  [95-97]     `14`
2.  [97-99]     `03`
3.  [99-101]    `27`
4.  [102-104]   `12`
5.  [105-107]   `08`
6.  [108-110]   `12`
解释 描述 要基于用户所需的datetime格式构造正则表达式,我只需获取他们的格式字符串,并用已知的正则表达式等价物替换各个块。换句话说,如果他们输入了
yy
,那么这意味着正则表达式
[0-9]{2}
,而
yyy
意味着
[0-9]{4}
,等等

例子 现场演示

Java代码

主类{
公共静态void main(字符串[]args){
System.out.println(转换(“yyyyMMdd”);
系统输出打印项次(转换(“yyyy-MM-dd”);
System.out.println(转换(“yyyyMMdd HH:mm”);
System.out.println(转换(“yyyyMMdd HH:mm:ss”);
System.out.println(转换(“yyyy-MMM-dd”);
}
公共静态字符串转换(字符串原始){
字符串输出=原始;
System.out.println(“”);
系统输出打印号(原件);
//年
Output=Output.replaceAll(“yyyy”,“[0-9]{4}”);
Output=Output.replaceAll(“yy”,“[0-9]{2}”);
//月
Output=Output.replaceAll(“MMMM”,“一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)”;
Output=Output.replaceAll(“MMM”,“一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月”);
Output=Output.replaceAll(“MM”,“(?:0[0-9]| 1[0-2])”;//00-12
//一天
Output=Output.replaceAll(“dddd”,“星期一|星期二|星期三|星期四|星期五|星期六|星期日”);
Output=Output.replaceAll(“ddd”,“星期一周二周三周四周五周六周日”);
Output=Output.replaceAll(“dd”,“(?:[0-2][0-9]| 3[01])”;//00-31
//时辰
Output=Output.replaceAll(“HH”和“(?:[0-1][0-9]| 2[0-3])”;//24小时格式
Output=Output.replaceAll(“hh”和“(?:0[0-9]| 1[0-2])”;//12小时格式
//会议记录
Output=Output.replaceAll(“mm”,“[0-5][0-9]”;//0-59
//秒
Output=Output.replaceAll(“ss”、“[0-5][0-9]”;//0-59
//子午线
Output=Output.replaceAll(“EE”,“(?:AM | PM)”);//AM或PM
Output=Output.replaceAll(“ee”,“(?:am | pm)”);//am或pm
//系统输出打印项次(输出);
返回输出;
}
}
样本输出

yyyyMMdd
[0-9]{4}(?:0[0-9]|1[0-2])(?:[0-2][0-9]|3[01])
每天
[0-9]{4}-(?:0[0-9]|1[0-2])-(?:[0-2][0-9]|3[01])
yyyyMMdd HH:mm
[0-9]{4}(?:0[0-9]|1[0-2])(?:[0-2][0-9]|3[01]) (?:[0-1][0-9]|2[0-3]):[0-5][0-9]
yyyyMMdd HH:mm:ss
[0-9]{4}(?:0[0-9]|1[0-2])(?:[0-2][0-9]|3[01]) (?:[0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]
yyyy MMM dd
[0-9]{4}(?:一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)(?:[0-2][0-9]| 3[01])
说明 要基于用户所需的datetime格式构造正则表达式,我只需获取他们的格式字符串,并用已知的正则表达式等价物替换各个块。换句话说,如果他们输入了
yy
,那么