java - 从字符串中提取当前日期模式,而不知道模式

时间:2016-06-17 08:16:02

标签: java regex string date

我想构建一个应用程序,它将接收用户定义的未知大小的字符串,并将它们标识为简单的字符串或日期。我想要做的是找到一种方法来提取字符串的日期模式,而不用知道程序将接收的字符串是否实际上是一个日期。

更确切地说,如果要接收的字符串将是

"2014-05-07_0533" //valid date

程序将返回

"yyyy-MM-dd_HHmm"

但是如果要收到的字符串是

"2014-05_667788" //not a valid date

程序将引发异常或以其他方式通知用户提供的String不遵循已知的日期模式,因此它不是日期。我可以想到实现上一个问题的一种方法是声明预定义的List可用日期模式,程序将接受这种模式,然后穷尽地尝试将提供的String与这些模式中的每一个进行匹配。当匹配时,程序将返回匹配的模式。如果没有匹配的可用模式,将返回null或消息。

上述想法存在的问题是程序将收到的字符串将扩展到数十或数十万,所以我开始认为这种方法会对应用程序产生重大影响#39;速度和整体内存占用。有更好的解决方案吗?

修改

到目前为止还没有代码,因为我处于开发的早期阶段,而且我正在运行一些关于如何实现它的想法。

EDIT2

对于那些请求代码示例的人来说,这是我到目前为止所想的:

public class DateMatching {

    public List<String> datePatterns = new ArrayList<>();

    public DateMatching() {
        initializePatterns();
    }

    private void initializePatterns() {
        datePatterns.add("yyyy-MM-dd_HH:mm");
        datePatterns.add("yyyy/MM/dd_HH:mm");
        datePatterns.add("yyyy.MM.dd_HH:mm");
        //and so on...
    }

    public final String getDatePattern(String supplied) {

        DateFormat format;
        for(String datePattern : datePatterns) {
            format = new SimpleDateFormat(datePattern);
            try {
                format.parse(supplied);
                return datePattern;
            } catch(ParseException e) {
                continue;
            }
        }
        return null; //No matched pattern
    }
}

由于datePatterns列表最多可包含50个或更多模式,并且应用程序将收到的字符串可能超过数十或数十万,我试图找到一种方法来减少匹配过程对所有这些字符串所需的时间量 - 假设有一个字符串开头。

2 个答案:

答案 0 :(得分:3)

成千上万的数量不是很大。

我只是尝试解析它并捕获异常:

private static final DateTimeFormatter FMT =  DateTimeFormatter.ofPattern("yyyy-MM-dd_HHmm");
public static boolean isValidDate(String input) {
  try {
    FMT.parse(input);
    return true;
  } catch (DateTimeParseException e) {
    return false;
  }
}

在我的机器上运行10,000次的方法需要不到100毫秒(甚至不允许JVM进行预热等)。

答案 1 :(得分:0)

正如其他人所说,没有办法实现我所要求的。应用程序需要知道在接收的String中从头开始寻找的模式是什么;它不能只是神奇地猜测一个字符串是一个没有事先知道如何实际组装日期的日期。因此,我将声明List预定义的日期模式,每次String到达时,我都会尝试将其与上述List进行匹配。我正在结束这个问题,感谢所有答案!