Regex使用在线工具验证正常,但在java应用程序中验证不正常

xqnpmsa8  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(165)

我在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代码中时,我不得不在从在线工具中移动它时,在regex模式中的其他反斜杠之前添加一个额外的\,即\d and \s -> \\d and \\s

bxfogqkk

bxfogqkk1#

该模式包含一个看起来不合适的组和替换:

^(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 > ^

这使您的current pattern match regex101

  • start[0-1]\d小时部分交替的左侧部分
  • 或从2[0-3]小时部分到 * 结束 * 的右侧部分

将此函数与matches()一起使用无法正常工作,因为它获得了匹配的against the full string
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

请参见www.example.com上的Java演示tio.run或demo at regex101(模式说明和代码生成器)

相关问题