我在Java中使用了这个正则表达式,如下所示:
private static final String DATE_TIME_REGEX = "^(20[1-5]\d)-(0?[1-9]|1[012])-(0?[1-9]|[12]\d|3[01])\s([0-1]\d)|(2[0-3]):([0-5]\d):([0-5]\d)$";
public static boolean validateDate(String dateStr) {
return dateStr.matches(DATE_TIME_REGEX);
}
…以以下格式验证日期:
private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = dateTimeFormatter.format(LocalDateTime.now());
…使用这个在线工具
https://regexr.com/
…添加这个正则表达式:
^(20[1-5]d)-(0?[1-9]|1[012])-(0?[1-9]|[12]d|3[01])s([0-1]d)|(2[0-3]):([0-5]d):([0-5]d)$
…可以很好地验证如下日期字符串:
2022-11-02 00:00:00
…但是无法使用java
中的上述验证代码进行验证(没有具体的指示)。为了排除我能想到的唯一警告-当将代码从在线工具添加到java代码中时,当从在线工具移动它时,我必须在正则表达式模式中的其他反斜杠之前添加一个额外的,即d and s -> \d and \s
。然而,我非常怀疑这是否是问题所在
模式包含一个看起来不合适的组和替换:
^(20[1-5]d)-(0?[1-9]|1[012])-(0?[1-9]|[12]d|3[01])s([0-1]d)|(2[0-3]):([0-5]d):...
^ HERE > ^
这使得您当前的模式匹配regex101
- 从start到
[0-1]d
hours-part - 或者从
2[0-3]
hours-part到end
使用matches()
不能工作,因为它与完整字符串匹配:
public boolean matches()
尝试匹配整个区域与模式相反。
如果匹配成功,则可以获得更多信息…
通过修复其工作良好的结构进行重构(使用matches
,^
和$
是冗余)。
20[1-5]d-(?:0?[1-9]|1[012])-(?:0?[1-9]|[12]d|3[01])s(?:[0-1]d|2[0-3]):[0-5]d:[0-5]d
在tio.run或regex101(模式解释和代码生成器)查看这个Java演示