问题描述
我需要对我的项目进行严格的输入验证,时间格式为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,后跟第二个数字