我需要使用正则表达式来验证下一个规则:
•前 8 个字符应采用 YYYYMMDD 的"日期"格式,不带 分隔符
•表达式总长度应为 13 个字符
我使用内部正则表达式管理器
Java代码示例:
import java.util.regex.Pattern;
public class TestDate {
public static final Pattern datePattern = Pattern.compile("** Need RegEx **");
public static void main(String[] args) {
System.out.println(datePattern.matcher("1996022965789").matches());
// -Wrong value
System.out.println(datePattern.matcher("1996022865789").matches());
// -Correct value
}
}
输入值和预期结果的示例:
输入:201909866666结果:长度错误
输入:2019022966666结果:错误的日期值
输入:2019022866666结果:正确
不要使用正则表达式来验证日期。这太复杂了。使用LocalDate
和DateTimeFormatter
。这是一个根本不使用任何正则表达式的解决方案。如果您愿意,您也可以使用正则表达式来检查日期后的 5 个字符是否为数字。
public void testDate(String dateString) {
if (dateString.length() == 13) {
// Check date part, first 8 digits
try {
LocalDate.parse(dateString.substring(0, 8), DateTimeFormatter.BASIC_ISO_DATE);
boolean allDigits = dateString.chars().allMatch(Character::isDigit);
if (allDigits) {
System.out.println(dateString + ": correct");
} else {
System.out.println(dateString + ": wrong character, must be digits");
}
} catch (DateTimeParseException dtpe) {
System.out.println(dateString + ": invalid date value");
}
} else {
System.out.println(dateString + ": wrong length");
}
}
让我们尝试一下:
testDate("1996022965789");
testDate("1996022865789");
testDate("201909866666");
testDate("2019022966666");
输出为:
1996022965789: correct 1996022865789: correct 201909866666: wrong length 2019022966666: invalid date value
对于第一个结果,1996 年是闰年,因此当年确实存在 2 月 29 日。最后一个结果显示无效的日期值,因为 2019 年不是闰年。
如果日期无效,LocalDate.parse
会抛出一个DateTimeParseException
,在这种情况下,我们会捕获并用于打印正确的消息。如果您愿意,您可以润色消息;就目前而言,它们可能太短且不是很用户友好。