java - 在不知道模式的情况下从字符串中提取当前日期模式

Posted

技术标签:

【中文标题】java - 在不知道模式的情况下从字符串中提取当前日期模式【英文标题】:java - Extract current date pattern from a String without knowing the pattern 【发布时间】:2016-10-18 23:45:28 【问题描述】:

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

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

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

程序将返回

"yyyy-MM-dd_HHmm"

但是如果要接收的String是

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

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

上述想法的问题是程序将接收到的Strings将被扩展到数万或数十万,所以我开始认为这种方法会对应用程序的速度和整体内存占用。有没有更好的解决方案?

编辑

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

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 个或更多模式,并且应用程序将收到的字符串可能超过数万或数十万,我正在尝试找到一种方法来减少匹配过程将需要所有这些字符串 - 假设有一个,开始。

【问题讨论】:

检查jchronic(见parser test)。 SO线程链接是here。 这些模式之间有何不同?那么是否有可能实现输入始终保持相同格式的逻辑? @Sanjeev 这个问题更多的是要求我提出改进而不是提供代码。 @KevinWallis 这就是我要问的。是否可以获取字符串包含的任何模式并自动查找它是否可以是日期? 是否有“否决”赏金,您是否急于对任何不提供代码的帖子投反对票,甚至没有阅读 OP 的问题?我认为 Stack Overflow 也可以为算法问题提供分析答案,而不仅仅是纠正新手在编程方面的错误...... 【参考方案1】:

几十万并不是一个巨大的数字。

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

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 预热等)。

【讨论】:

正确,这就是我到目前为止所想到的,但是有没有一种不同的方法来实现它,而不是构造一个相对较大的 if-then-else 语句来尝试将字符串与所有可用的日期模式匹配? @Lefteris008 创建Set,其中包含所有允许的模式,并根据Set 的条目检查给定模式......这只是一种简单的方法。 @KevinWallis 我认为在List 上使用Set 没有意义,因为我仍然需要遍历所有日期模式并尝试一一匹配它们使用提供的字符串。不过还是谢谢! @Lefteris008 当你可以从给定的输入中找到模式没有问题时,你可以使用Set 这就是我的想法 @KevinWallis 是的,但首先要找到模式,我必须彻底尝试将字符串与我将声明的所有预定义日期模式匹配。当我有匹配时,我会返回匹配的模式。【参考方案2】:

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

【讨论】:

以上是关于java - 在不知道模式的情况下从字符串中提取当前日期模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?

如何在不提取的情况下从 zip 设置图片框图像位置?

如何在不推动我的情况下从GitHub中提取更改?

在不知道对象索引的情况下从数组中删除对象?

如何在不导入的情况下从 .dmp 文件中列出 Oracle 中的所有模式和表空间?

在不知道所有属性的情况下从 HTML 标记内部获取文本