Java - 使用regex-failure从字符串中提取日期

时间:2013-09-03 11:33:32

标签: java regex date

我正在尝试使用正则表达式从字符串中提取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" 我得到一个空数组...

5 个答案:

答案 0 :(得分:11)

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

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

这个应该符合您的需求:

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

Regular expression visualization

Debuggex

答案 1 :(得分:7)

3个问题:

1)您尝试使用格式dd/MM/YYYY解析日期,其中正则表达式的格式为MM/dd/YYYY

2)你忘了在while循环中增加count

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

答案 2 :(得分:4)

您的月份和日期已经倒退,(?:,)在每个日期结束时需要逗号。试试这个:

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

答案 3 :(得分: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

上找到

答案 4 :(得分:0)

class ThirdComponent extends Component { render() { return ( // print score which is in redux <div>this.props.score</div> ); } } export default connect(mapStateToProps)(ThirdComponent); 代替正则表达式

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

您可以在SPACE字符上拆分字符串,并尝试将每个元素解析为LocalDate。如果解析失败,请转到下一个元素。

redux

请参阅此code run live at IdeOne.com

  

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