我到处都在搜索此内容,但是找不到具体的解决方案,文档也没有对此进行介绍。因此,我想从此字符串"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)。
答案 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]);