我正在寻找一个正则表达式,它支持一个字符串的模式[#d][#h][#m][#s]
来指定一个持续时间,其中'd'为天,'h'为小时等。
一些有效的字符串是,1h2s
,1m
,2m15s
,2h10s
等。2m1h
、2k30s
无效
我试过下面的代码
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)?$");
但是,仍然得到相同的结果。
**我需要在我的代码中改变什么才能实现我想要的?谢谢。
2条答案
按热度按时间mrfwxfqh1#
为什么不只是一个if..else条件,例如:
输出
7lrncoxx2#
首先,您的代码暗示如果值不匹配,则将抛出 PatternSyntaxException。
事实并非如此;这是用于当语法内存在错误时,例如,开放组,"(\d+d”。
要修复代码,只需使用条件语句。
此外,您还需要检查 duration 是否不为空。
由于这里的每个组都指定了 optional,? ,quantifier,空值将匹配。
此外,您可以使用单个正则表达式检查该值,尽管它有些冗长。
您需要提供每个组合。
下面是第一种通用方法,它不计算数字。
这里是第二个,它检查有效性-例如,不是 “24 h” 或 “60 m” 等。
最后,这里是您的原始模式,以及有效性检查。
示例
输出量