9

我正在尝试使用正则表达式从字符串中提取 2 个日期 - 出于某种原因 - 正则表达式不提取日期 - 这是我的代码:

private  String[] getDate(String desc) {
    int count=0;
    String[] allMatches = new String[2];
    Matcher m = Pattern.compile("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d(?:,)").matcher(desc);
    while (m.find()) {
        allMatches[count] = m.group();
    }
    return allMatches;
}

我的字符串- desc 是:"coming from the 11/25/2009 to the 11/30/2009" 我得到一个空数组......

4

5 回答 5

13

您的正则表达式首先匹配日期,然后是月份 (DD/MM/YYYY),而您的输入以月份开头,然后是日期 (MM/DD/YYYY)。

此外,您的日期后面必须跟一个逗号才能匹配((?:,)部分)。

这应该适合您的需求:

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d

正则表达式可视化

Debuggex 绘制的图表。

于 2013-09-03T11:41:46.220 回答
7

3个问题:

1)您正在尝试使用格式解析日期dd/MM/YYYY,因为您的正则表达式具有 format MM/dd/YYYY

2)您忘记count在 while 循环中递增。

3)(?:,)正则表达式末尾的部分是无用的。

此代码适用于我的计算机:

private static String[] getDate(String desc) {
  int count=0;
  String[] allMatches = new String[2];
  Matcher m = Pattern.compile("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d").matcher(desc);
  while (m.find()) {
    allMatches[count] = m.group();
    count++;
  }
  return allMatches;
}

测试

public static void main(String[] args) throws Exception{
  String[] dates = getDate("coming from the 25/11/2009 to the 30/11/2009");

  System.out.println(dates[0]);
  System.out.println(dates[1]);

}

输出

25/11/2009
30/11/2009
于 2013-09-03T11:43:16.457 回答
5

您将月份的月份和日期倒退,并且(?:,)在每个日期的末尾都需要一个逗号。试试这个:

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d
于 2013-09-03T11:41:01.297 回答
0

LocalTime.parse而不是正则表达式

对于这样的问题,正则表达式可能是矫枉过正的。

您可以将字符串拆分为空格字符,并尝试将每个元素解析为LocalDate. 如果解析失败,则继续下一个元素。

String input = "coming from the 11/25/2009 to the 11/30/2009" ;
String[] elements = input.split( " " ) ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
List<LocalDate> dates = new ArrayList<>() ;
for( String element : elements ) {
    try {
        LocalDate ld = LocalDate.parse( element , f ) ;
        dates.add( ld ) ;
    } catch ( DateTimeParseException e ) {
        // Ignore the exception. Move on to next element.
    }
}
System.out.println( "dates: " + dates ) ;

请参阅在 IdeOne.com 上实时运行的代码

日期:[2009-11-25, 2009-11-30]

于 2017-10-17T19:22:17.890 回答
0

一种日期模式识别算法,不仅可以识别日期模式,还可以获取 Java 日期格式的可能日期。该算法非常快速且轻量级。处理时间是线性的,所有日期都在一次通过中确定。算法使用树遍历机制解析日期。自定义创建树数据结构以构建支持的日期、时间和月份模式。

该算法还承认日期文字之间的多个空格字符。例如,DD DD DD 和 DD DD DD 被视为有效日期。

以下日期模式被认为是有效的,并且可以使用该算法进行识别。

dd MM(MM) yy(yy) yy(yy) MM(MM) dd MM(MM) dd yy(yy)

其中 M 是月份文字是字母格式,如 Jan 或 January

日期之间允许的分隔符是'/'、'\'、''、','、'|'、'-'、''

它还可以识别以下格式的尾随时间模式 hh(24):mm:ss.SSS am / pm hh(24):mm:ss am / pm hh(24):mm:ss am / pm

解决时间是线性的,不使用模式匹配或蛮力。该算法基于树遍历并返回具有以下三个组件的日期列表 - 文本中标识的日期字符串 - 转换和格式化的日期字符串 - SimpleDateFormat

使用日期字符串和格式字符串,用户可以根据自己的需要自由地将字符串转换为对象。

该算法库可在 maven Central 获得。

<dependency>
    <groupId>net.rationalminds</groupId>
    <artifactId>DateParser</artifactId>
    <version>0.3.0</version>
</dependency>

使用它的示例代码如下。

import java.util.List;  
 import net.rationalminds.LocalDateModel;  
 import net.rationalminds.Parser;  
 public class Test {  
   public static void main(String[] args) throws Exception {  
        Parser parser=new Parser();  
        List<LocalDateModel> dates=parser.parse("Identified date :'2015-January-10 18:00:01.704', converted");  
        System.out.println(dates);  
   }  
 }  

输出:[LocalDateModel{originalText=2015-january-10 18:00:01.704, dateTimeString=2015-1-10 18:00:01.704, conDateFormat=yyyy-MM-dd HH:mm:ss.SSS, start=18,结束=46}]

详细博客位于http://coffeefromme.blogspot.com/2015/10/how-to-extract-date-object-from-given.html

GitHub 上的完整源代码位于https://github.com/vbhavsingh/DateParser

于 2017-06-06T03:47:58.310 回答