Regex在在线工具中可以很好地验证,但在java应用程序中不行



我在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]dhours-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演示

相关内容

最新更新