【问题标题】:Regex for time in hh:mm am/pm format in javajava中hh:mm am / pm格式的时间正则表达式
【发布时间】:2021-02-24 01:26:56
【问题描述】:

我需要对我的项目的输入进行严格验证,时间格式为 HH:MM am/pm。到目前为止,我已经有了这个 RegEx 表达式:

(1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm)

上面的表达式工作正常,但是当我通过上午 9:05 时它不工作,当我通过上午 9:05 时它工作

有人可以建议我如何解决这个问题。

代码

public class SampleClass {

    public static void main(String[] args) {
        String inputTimeString = "09:05 PM";
        boolean isValidaTim = isValidTime(inputTimeString);
        if (isValidaTim) {
            System.out.println("Valid time string: " + inputTimeString);
        } else {
            System.out.println("Invalid time string: " + inputTimeString);
        }
    }

    public static boolean isValidTime(String time) {
        String regexPattern = "(1[012]|[1-9]):" + "[0-5][0-9](\\s)" + "?(?i)(am|pm)";
        Pattern compiledPattern = Pattern.compile(regexPattern);
        if (time == null) {
            return false;
        }
        Matcher m = compiledPattern.matcher(time);
        return m.matches();
    }

}

【问题讨论】:

  • 必须使用正则表达式吗?
  • 没有强制使用。我想要工作代码
  • 所以需要使用正则表达式??或者你可以使用 LocalTime 吗?
  • 仅用于匹配,您不需要捕获组。你必须添加一个可选的零来匹配09,你可以使用一个字符类作为上午下午部分(?:1[012]|0?[1-9]):[0-5][0-9]\\h?(?i)[ap]mregex101.com/r/0ien3M/1
  • 正则表达式在这里是多余的。查看Answer by Ole V.V.中显示的java.time类的使用

标签: java regex time-format


【解决方案1】:

java.time

不要为此使用正则表达式。使用 java.time,现代 Java 日期和时间 API。

private static final DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("h:mm a")
        .toFormatter(Locale.ENGLISH);

public static boolean isValidTime(String time) {
    try {
        LocalTime.parse(time, timeFormatter);
        return true;
    } catch (DateTimeParseException dtpe) {
        return false;
    }
}

尝试一下:

    System.out.println("Is 9:05 am valid? " + isValidTime("9:05 am"));
    System.out.println("Is 09:05 PM valid? " + isValidTime("09:05 PM"));

输出:

Is 9:05 am valid? true
Is 09:05 PM valid? true

如果您想允许一位数分钟并允许省略空格,请像这样编写您的模式:

        .appendPattern("h:m[ ]a")
Is 09:10PM valid? true
Is 09:5 PM valid? true

在大多数情况下,您还应该保留解析产生的 LocalTime 对象,而不是将时间保存在字符串中。

链接: Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

    【解决方案2】:

    只需通过正则表达式。您从1[012]|[1-9] 开始。所以,要么是 10,要么是 11,要么是 12,要么是一个非零数字。更新第二部分,注意 00 也是一个有效小时:1[012]|0?[0-9] 将完成工作。那里有很多正则表达式教程和测试人员。

    然后,您在 am/pm 的最后一位中添加一个问号作为第一个字符 - 这是什么意思?这使得最后一位数字成为可选的,这看起来很奇怪;这意味着10:5 匹配但10:6 不会。您可能希望在两者之间留出空格,因此也可以在其中插入 \\s*

    【讨论】:

    • 感谢现在工作。但是如果我通过 09:10 PM 或 09:5 PM 它应该允许你能建议吗
    【解决方案3】:

    我会试试这个(\d|0\d|1[012]):([0-5]\d)\s*(am|pm)

    小时 (\d|0\d|1[012]) 可以是一位数、零和一位数或 10、11、12

    分钟 ([0-5]\d) 可以是 0 到 5 后跟第二个数字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 2012-09-18
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多