微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于Java的hh:mm am / pm格式的正则表达式

如何解决用于Java的hh:mm am / pm格式的正则表达式

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

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

上面的表达式工作正常,但是当我通过09:05 AM时,它不起作用,而当我通过9:05 AM时,它仍在工作

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

代码

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();
    }

}

解决方法

java.time

请勿为此使用正则表达式。使用现代的Java日期和时间API java.time。

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。

,

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

然后您在上午/下午的最后一位中插入一个问号作为第一个字符-这是怎么回事?这使得分钟的最后一位数字是可选的,这看起来很奇怪。这意味着10:5个匹配项,但10:6不匹配。您大概想在它们之间留有空格,因此也要在其中扔一个\\s*

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。