3 回答

TA贡献1785条经验 获得超4个赞
您可以捕获两个日期,只需调用该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())请注意,这可以与 a和 a一起使用,List<String以便能够提取您可以找到的每个日期。

TA贡献1877条经验 获得超6个赞
如果您的文本可能很乱,并且您确实需要使用正则表达式来提取日期范围,您可以使用
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 演示
此外,请考虑此增强功能:将日期作为整个单词进行匹配,以避免在较长的字符串中出现部分匹配:
Pattern.compile("\\b(" + date_rx + ")\\s*to\\s*(" + date_rx + ")\\b")
如果范围可以用 表示-,或者to您可以用 替换to,(?:to|-)甚至(?:to|\\p{Pd})where\p{Pd}匹配任何连字符/破折号。

TA贡献1827条经验 获得超4个赞
你可以简单地使用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]);
添加回答
举报