从Java中的字符串中提取多个日期(dd-MMM-yyyy格式)

时间:2019-07-02 08:30:24

标签: java regex string date

我到处都在搜索此内容,但是找不到具体的解决方案,文档也没有对此进行介绍。因此,我想从此字符串"1-Mar-2019 to 31-Mar-2019"中提取开始日期和结束日期。问题是我无法同时提取两个日期字符串。

我在这里找到了最接近的解决方案,但是由于信誉低而无法发表评论询问如何分别提取值:https://stackoverflow.com/a/8116229/10735227

我正在使用正则表达式模式查找出现的内容,并首先将两个出现的内容都提取到2个字符串中。
这是我尝试过的:

Pattern p = Pattern.compile("(\\d{1,2}-[a-zA-Z]{3}-\\d{4})");  
Matcher m = p.matcher(str);
while(m.find())
{
    startdt = m.group(1); 
    enddt = m.group(1);   //I think this is wrong, don't know how to fix it
}
System.out.println("startdt: "+startdt+" enddt: "+enddt);

输出为:

startdt: 31-Mar-2019 enddt: 31-Mar-2019

此外,我还需要使用DateFormatter将字符串转换为日期(如果需要,可以在单位数日期之前添加尾随0)。

3 个答案:

答案 0 :(得分:1)

只需两次调用find方法就可以捕获两个日期,如果只有一个,则只能捕获第一个:

String str = "1-Mar-2019 to 31-Mar-2019";

String startdt = null, enddt = null;

Pattern p = Pattern.compile("(\\d{1,2}-[a-zA-Z]{3}-\\d{4})");  
Matcher m = p.matcher(str);
if(m.find()) {
    startdt = m.group(1); 
    if(m.find()) {
       enddt = m.group(1);
    }
}   
System.out.println("startdt: "+startdt+" enddt: "+enddt);

请注意,它可以与while(m.find())List<String一起使用,以提取您可以找到的每个日期。

答案 1 :(得分:1)

如果您的文本可能很乱,并且确实需要使用正则表达式来提取日期范围,则可以使用

String str = "Text here 1-Mar-2019 to 31-Mar-2019 and tex there";
String startdt = "";
String enddt = "";

String date_rx = "\\d{1,2}-[a-zA-Z]{3}-\\d{4}";
Pattern p = Pattern.compile("(" + date_rx + ")\\s*to\\s*(" + date_rx + ")");  
Matcher m = p.matcher(str);
if(m.find())
{
    startdt = m.group(1); 
    enddt = m.group(2); 
}
System.out.println("startdt: "+startdt+" enddt: "+enddt);
// => startdt: 1-Mar-2019 enddt: 31-Mar-2019

请参见Java demo

此外,请考虑此增强功能:将日期与整个单词匹配,以避免较长字符串中的部分匹配:

Pattern.compile("\\b(" + date_rx + ")\\s*to\\s*(" + date_rx + ")\\b")

如果范围可以用-to表示,则可以将to替换为(?:to|-),甚至可以将(?:to|\\p{Pd})匹配的\p{Pd}替换为{ 任何连字符/破折号。

答案 2 :(得分:0)

您可以简单地使用String::split

String range = "1-Mar-2019 to 31-Mar-2019";
String dts [] = range.split(" ");
System.out.println(dts[0]);
System.out.println(dts[2]);