regex Java正则表达式,用于模式[#d][#h][#m][#s]指定持续时间,字段是可选的,但已排序

nwlqm0z1  于 2023-06-25  发布在  Java
关注(0)|答案(2)|浏览(87)

我正在寻找一个正则表达式,它支持一个字符串的模式[#d][#h][#m][#s]来指定一个持续时间,其中'd'为天,'h'为小时等。
一些有效的字符串是,1h2s1m2m15s2h10s等。
2m1h2k30s无效
我试过下面的代码

String duration = "2d0k15s";

try {
    duration.matches("(\\d+d)?(\\d+h)?(\\d+m)?(\\d+s)?");
    
    System.out.println("Valid.");
} catch (final PatternSyntaxException pse) {
    System.out.println("Not valid! " + pse.getMessage());
}

但它说对所有输入都有效。我试过了,duration.matches("(\\d+d)?(\\d+h)?(\\d+m)?(\\d+s)?$");
但是,仍然得到相同的结果。

**我需要在我的代码中改变什么才能实现我想要的?谢谢。

mrfwxfqh

mrfwxfqh1#

为什么不只是一个if..else条件,例如:

final String regex = "(\\d+d)?(\\d+h)?(\\d+m)?(\\d+s)?";
String[] durations = {"1h2s", "1m", "2m15s", "2h10s", "2m1h", "2k30s"};

for (String duration : durations) {

    // Just this
    if (duration.matches(regex)) {
        System.out.println("Valid");
    } else {
        System.out.println("Not Valid");
    }

}

输出

Valid
Valid
Valid
Valid
Not Valid
Not Valid
7lrncoxx

7lrncoxx2#

首先,您的代码暗示如果值不匹配,则将抛出 PatternSyntaxException
事实并非如此;这是用于当语法内存在错误时,例如,开放组,"(\d+d”
要修复代码,只需使用条件语句。
此外,您还需要检查 duration 是否不为空。
由于这里的每个组都指定了 optional ,quantifier,空值将匹配。

String duration = "2d0k15s";
if (!duration.isEmpty() && duration.matches("(\\d+d)?(\\d+h)?(\\d+m)?(\\d+s)?")) {
    System.out.println("Valid.");
} else {
    System.out.println("Not valid!");
}

此外,您可以使用单个正则表达式检查该值,尽管它有些冗长。
您需要提供每个组合。
下面是第一种通用方法,它不计算数字。

^(?:(?:\d+d)(?:(?:\d+h)?(?:\d+m)?(?:\d+s)?)|(?:\d+h)(?:(?:\d+m)?(?:\d+s)?)|(?:(?:\d+m)(?:\d+s)?)|(?:\d+s))$

这里是第二个,它检查有效性-例如,不是 “24 h”“60 m” 等。

^(?:(?:[1-9]+d)(?:(?:(?:2[0-3]|1\d|[1-9])h)?(?:(?:[1-5]\d|[1-9])m)?(?:(?:[1-5]\d|[1-9])s)?)|(?:(?:2[0-3]|1\d|[1-9])h)(?:(?:(?:[1-5]\d|[1-9])m)?(?:(?:[1-5]\d|[1-9])s)?)|(?:(?:(?:[1-5]\d|[1-9])m)(?:(?:[1-5]\d|[1-9])s)?)|(?:(?:[1-5]\d|[1-9])s))$

最后,这里是您的原始模式,以及有效性检查。

(?:[1-9]+d)?(?:(?:2[0-3]|1\d|[1-9])h)?(?:(?:[1-5]\d|[1-9])m)?(?:(?:[1-5]\d|[1-9])s)?

示例

String[] strings = {
    "1h2s", "1m", "2m15s", "2h10s",
    "2m1h", "2k30s", "", "0d", "24h", "60m", "60s" };
String regex = "(?:[1-9]+d)?(?:(?:2[0-3]|1\\d|[1-9])h)?(?:(?:[1-5]\\d|[1-9])m)?(?:(?:[1-5]\\d|[1-9])s)?";
boolean valid;
for (String string : strings) {
    valid = !string.isEmpty() && string.matches(regex);
    System.out.printf("%-10s is %s%n", "'%s'".formatted(string), valid ? "valid" : "invalid");
}

输出量

'1h2s'     is valid
'1m'       is valid
'2m15s'    is valid
'2h10s'    is valid
'2m1h'     is invalid
'2k30s'    is invalid
''         is invalid
'0d'       is invalid
'24h'      is invalid
'60m'      is invalid
'60s'      is invalid

相关问题