yyyymmddhhmmss的Java正则表达式

yyyymmddhhmmss的Java正则表达式,java,regex,Java,Regex,我正在寻找yyyymmddhhmmss格式的Java正则表达式模式。它还应该检查闰年 下面的模式只检查yyyymmdd和闰年,但现在我需要将其扩展到yyyymmddhhmms(以便它包括24小时时间格式验证) 谢谢。花了一些时间详细阐述,但它非常简单: (\d{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])([0-1][0-9]|2[0-4])(([0-5][0-9]){2})) 我想这就是你要找的。您可以在中测试它 干杯 花了一些时间详细阐述,但它非常简单: (\d

我正在寻找yyyymmddhhmmss格式的Java正则表达式模式。它还应该检查闰年

下面的模式只检查yyyymmdd和闰年,但现在我需要将其扩展到yyyymmddhhmms(以便它包括24小时时间格式验证)


谢谢。

花了一些时间详细阐述,但它非常简单:

(\d{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])([0-1][0-9]|2[0-4])(([0-5][0-9]){2}))
我想这就是你要找的。您可以在中测试它


干杯

花了一些时间详细阐述,但它非常简单:

(\d{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])([0-1][0-9]|2[0-4])(([0-5][0-9]){2}))
我想这就是你要找的。您可以在中测试它


干杯

这里有一种验证日期时间值的非正则方法

import java.text.*;
...
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setLenient(false);
try {
       Date dt2 = sdf.parse("20150229105950");
       System.out.println(dt2);
}
catch (Exception exc) {
    System.out.println("NOT VALID");
}

为了使用正则表达式验证24小时时间,您需要将以下内容附加到正则表达式:

(?:0[0-9]|1[0-9]|2[0-3])(?:[0-5][0-9]){2}
(?:0[0-9]| 1[0-9]| 2[0-3])
部分将验证从
00
23
的数字,
(?:[0-5][0-9]){2}
将验证分和秒

然后,您的正则表达式将如下所示:

(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))(?:0[0-9]|1[0-9]|2[0-3])(?:[0-5][0-9]){2}


注意,您正在使用
matches()
方法强制对整个字符串进行匹配,因此似乎不需要使用
$
锚定。

这里是一种验证日期时间值的非正则方法

import java.text.*;
...
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setLenient(false);
try {
       Date dt2 = sdf.parse("20150229105950");
       System.out.println(dt2);
}
catch (Exception exc) {
    System.out.println("NOT VALID");
}

为了使用正则表达式验证24小时时间,您需要将以下内容附加到正则表达式:

(?:0[0-9]|1[0-9]|2[0-3])(?:[0-5][0-9]){2}
(?:0[0-9]| 1[0-9]| 2[0-3])
部分将验证从
00
23
的数字,
(?:[0-5][0-9]){2}
将验证分和秒

然后,您的正则表达式将如下所示:

(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))(?:0[0-9]|1[0-9]|2[0-3])(?:[0-5][0-9]){2}


注意,您正在使用
matches()
方法强制对整个字符串进行匹配,因此似乎不需要使用
$
锚定。

如果不需要处理闰秒(这一点),请使用to
false
禁用宽松解析。这比编写一个不可维护的正则表达式来解析它要好

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SO31132861 {
    public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        df.setLenient(false);

        System.out.println(tryParse(df, "20160630231110"));
        System.out.println(tryParse(df, "20150228231100"));
        System.out.println(tryParse(df, "20160229231100"));

        System.out.println(tryParse(df, "21000229231100")); // 29th Feb on non-leap year 2100
        System.out.println(tryParse(df, "20160631231110")); // 31st Jun invalid day
        System.out.println(tryParse(df, "20160229231160")); // Second > 59
        System.out.println(tryParse(df, "20150229231100")); // 29th Feb on non-leap year 2015
        System.out.println(tryParse(df, "20150228241100")); // Hour > 23
    }

    private static Date tryParse(DateFormat df, String s) {
        try {
            return df.parse(s);
        } catch (ParseException e) {
            return null;
        }
    }
}

如果您需要闰秒,您可能需要查看以下答案:

如果您不需要处理闰秒(which),请使用to
false
禁用宽松解析。这比编写一个不可维护的正则表达式来解析它要好

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SO31132861 {
    public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        df.setLenient(false);

        System.out.println(tryParse(df, "20160630231110"));
        System.out.println(tryParse(df, "20150228231100"));
        System.out.println(tryParse(df, "20160229231100"));

        System.out.println(tryParse(df, "21000229231100")); // 29th Feb on non-leap year 2100
        System.out.println(tryParse(df, "20160631231110")); // 31st Jun invalid day
        System.out.println(tryParse(df, "20160229231160")); // Second > 59
        System.out.println(tryParse(df, "20150229231100")); // 29th Feb on non-leap year 2015
        System.out.println(tryParse(df, "20150228241100")); // Hour > 23
    }

    private static Date tryParse(DateFormat df, String s) {
        try {
            return df.parse(s);
        } catch (ParseException e) {
            return null;
        }
    }
}
如果您需要leap second,您可能想看看这个答案:

不需要正则表达式 Java有一组业界领先的用于日期时间处理的类,可以在Java.time包中找到。让他们来处理输入字符串的解析,而不是搞乱正则表达式

java.time 现代方法使用java.time类取代了麻烦的遗留日期时间类(
date
Calendar
SimpleDateFormat

定义与输入字符串匹配的格式模式

String input = "20180123123456" ;  // yyyymmddhhmmss
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" ) ;
因为您的输入缺少任何时区或UTC偏移的指示

LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString():2018-01-23T12:34:56

要捕获无效输入,请捕获

顺便说一句,请注意,如果没有时区或UTC偏移的上下文,您的输入字符串和
LocalDateTime
并不表示特定的时刻,也不是时间线上的一个点。它们代表大约26-27小时范围内的潜在时刻(时区偏移的最小/最大范围)


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类