yyyymmddhhmmss的Java正则表达式
我正在寻找yyyymmddhhmmss格式的Java正则表达式模式。它还应该检查闰年 下面的模式只检查yyyymmdd和闰年,但现在我需要将其扩展到yyyymmddhhmms(以便它包括24小时时间格式验证)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
谢谢。花了一些时间详细阐述,但它非常简单:
(\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()
方法强制对整个字符串进行匹配,因此似乎不需要使用$
锚定。如果不需要处理闰秒(这一点),请使用tofalse
禁用宽松解析。这比编写一个不可维护的正则表达式来解析它要好
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类
- 然后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(不需要正则表达式
Java有一组业界领先的用于日期时间处理的类,可以在Java.time包中找到。让它们来处理输入字符串的解析,而不是弄乱正则表达式
java.time
现代方法使用java.time类取代了麻烦的遗留日期时间类(
,date
,Calendar
) 定义与输入字符串匹配的格式模式SimpleDateFormat
因为您的输入缺少任何时区或UTC偏移的指示String input = "20180123123456" ; // yyyymmddhhmmss DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" ) ;
ldt.toString():2018-01-23T12:34:56 要捕获无效输入,请捕获 顺便说一句,请注意,如果没有时区或UTC偏移的上下文,您的输入字符串和LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
并不表示特定时刻,也不是时间线上的一个点。它们表示大约26-27小时范围内的潜在时刻(时区偏移的最小/最大范围)LocalDateTime
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
classes 从哪里获得java.time类java.sql.*
- 然后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
- 然后