【问题标题】:How to check if a string contains a date in Java?如何检查字符串是否包含Java中的日期?
【发布时间】:2017-10-21 05:12:55
【问题描述】:

如何检查字符串是否包含这种形式的日期:

美国东部标准时间 2012 年 1 月 15 日星期日晚上 7:36

我正在处理的数据包含大量字符串。但我要查找的字符串类型包含 2 或 3 个单词的名称和日期。我正在检查日期以识别这些类型的字符串。

我已经为这种类型的日期找到了 simpleDateFormat。

String string1 = "Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST";
String string2 = "Aritra Sinha Nirmal Friday, April 1, 2016 at 10:16pm EDT";    

SimpleDateFormat format = new SimpleDateFormat("EEEEE, MMM dd, yyyy 'at' hh:mmaa z");

但我不知道如何继续。

我猜正则表达式可能有效,但当月/日名称的长度不同时,我不知道如何实现它。即“May”比“December”短得多。

我想知道是否有使用正则表达式的解决方案或更简单的解决方案。

我知道还有其他线程问类似的问题,但他们没有回答我的问题。

【问题讨论】:

  • 使用format.parse(string)如果格式不匹配会抛出ParseException
  • 检查星期几和月份的正则表达式可能会很长。您能否更好地描述您认为需要检查字符串以查看它们是否为日期的实际问题?
  • 为什么?只需尝试将其解析为日期并捕获异常。重复所有这些努力是没有意义的。
  • 字符串不仅仅是日期。因此,符合我的条件但也包含其他单词的字符串会抛出异常,我会错过它们。

标签: java regex string date simpledateformat


【解决方案1】:

您可以使用 simpleDateFormat 解析方法对其进行测试。要继续您的代码,请在代码周围加上 try/catch,例如:

try {
    Date date = format.parse(string);
} catch (ParseException e) {
        //the string is not applicable to the date format
}

如果日期是遵循 SimpleDateFormat 格式准则的字符串,则日期将被成功创建。

【讨论】:

  • 我使用的字符串不仅仅包含日期。所以这总是会抛出异常。
  • 如果一个字符串包含的不仅仅是日期,它仍然会解析它并创建一个日期,如果字符串首先包含日期并且字符串的其余部分作为后缀。所以对于字符串:“2012 年 1 月 15 日,美国东部标准时间晚上 7:37,Rahul Chowdhury Sunday”它会起作用。如果翻转顺序太棘手,您可以只解析子字符串 - 只需运行:try { Date date = format.parse(string.substring(string.indexOf(",")+1); } catch (ParseException e) { //该字符串不适用于日期格式 }
【解决方案2】:

如果你不想使用Regex,你可以这样做(我知道这很痛苦,但只是一种不同的方法)。

public class ParseDate {

    public static void main(String[] args) {
        String date = "Rahul Chowdhury Sunday, January 15, 2012 at 7:36pm EST";
        //Pattern: "Fullname EEEEE, MMM dd, yyyy 'at' hh:mmaa z"
        String dateComponents[] = date.split(",");
        String fullName = dateComponents[0].substring(0, dateComponents[0].lastIndexOf(" "));
        String dayText = dateComponents[0].substring(dateComponents[0].lastIndexOf(" "));
        String month = dateComponents[1].trim().split(" ")[0];
        String dayNumber = dateComponents[1].trim().split(" ")[1];
        String year = dateComponents[2].split("at")[0];
        String time = dateComponents[2].split("at")[1].trim().split(" ")[0];
        String zone =dateComponents[2].split("at")[1].trim().split(" ")[1];

        // if you want to go further 
        String hour = time.split(":")[0];
        String minutes = time.split(":")[1].substring(0,2);
        String aa = time.split(":")[1].substring(2,4);


        System.out.println(fullName + " " + dayText + " " + month + " " + dayNumber + " " + year + " " + time + " " + zone);
        System.out.println(hour + " " + minutes + " " + aa);
    }


}

输出

Rahul Chowdhury Sunday January 15  2012  7:36pm EST
7 36 pm

【讨论】:

    【解决方案3】:

    您可以先使用正则表达式检查您的日期是否存在:

    \w+,\s+\w+\s+\d+\,\s+\d+\s+at\s+\d+:\d+(pm|am)\s+\w{3,4}
    

    这个正则表达式匹配两者

    Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST
    Aritra Sinha Nirmal Friday, April 1, 2016 at 10:16pm EDT
    

    https://regex101.com/r/V0dAf8/2/

    当您在文本中找到匹配项时,您可以使用SimpleDateFormat 检查它是否格式正确。

    String input = "Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST";
    String regex = "(\\w+,\\s+\\w+\\s+\\d+\\,\\s+\\d+\\s+at\\s+\\d+:\\d+(pm|am)\\s+\\w{3,4})";
    Matcher matcher = Pattern.compile(regex).matcher(input);
    if (matcher.find()) {
      System.out.println(matcher.group(1));
    }
    

    这将打印:

    Sunday, January 15, 2012 at 7:37pm EST
    

    【讨论】:

    • 我爱你。非常感谢。
    • 我想你至少会在最后想要\w{3,4};一些时区缩写是四个字母。您可能需要也可能不需要容纳更多时区名称,例如 Z 或 +01:00。
    • @OleV.V.感谢您的建议,我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2014-12-27
    相关资源
    最近更新 更多