gpt4 book ai didi

Java RegEx 日期验证 - 闰年

转载 作者:行者123 更新时间:2023-11-30 07:56:41 26 4
gpt4 key购买 nike

我正在做一项学校作业,我只是坚持这方面的逻辑。基本上需要验证 1900 年到 2099 年之间的正则表达式(日期)。天数不能超过最大月天数; (即 6 月有 30 天,所以 31 天无效)以及考虑闰年,其中 2 月日期可以是 29。这是我到目前为止所拥有的,但是当代码在 TestHarness 中运行时,我不断收到验证错误。我想我在这里有很多逻辑但不确定如何解决。任何帮助都会很棒。

    public class RegexValidator {
//class variables
private String DATE_REGEX = "^((19|20)\\d\\d)-(0?[1-9]|
1[012])-(0?[1-9]|[12][0-9]|3[01])$";

public RegexValidator() {
m_datePattern.compile(DATE_REGEX);
}

public boolean validDate(String date) {

Matcher matcher = m_datePattern.matcher(date);

int year = Integer.parseInt(matcher.group(1));//parse to calculate leap
String month = matcher.group(2);
String day = matcher.group(3);

if(matcher.matches()) {
matcher.reset();

if(matcher.find()) {

if(day.equals("31") && (month.equals("4") || month.equals("04") ||
month.equals("6") || month.equals("06") || month.equals("9") ||
month.equals("09") || month.equals("11"))) {
return false;
} else if(month.equals("2") || month.equals("02")) {
//accounts for leap year
if(year % 4 == 0) {
if(day.equals("30") || day.equals("31")) {
return false;
} else {
return true;
}
} else {
if(day.equals("29") || day.equals("30") || day.equals("31")) {
return false;
} else {
return true;
}
}
} else {
return true;
}
} else {
return false;
}
} else {
return false;
}

}

这是我遇到的错误列表:

    Error validating date '1900-1-11'

Error validating date '1900-1-11'

---- test date 1892-02-29 - expected false
---- Exception calling validDate: null
---- test date 1976-02-29 - expected true
---- Exception calling validDate: null
Error validating date '1976-02-29'

Error validating date '1976-02-29'

---- test date 2001-02-29 - expected false
---- Exception calling validDate: null
---- test date 2002-13-02 - expected false
---- Exception calling validDate: null
---- test date 2003-01-31 - expected true
---- Exception calling validDate: null
Error validating date '2003-01-31'

Error validating date '2003-01-31'

---- test date 1964-03-31 - expected true
---- Exception calling validDate: null
Error validating date '1964-03-31'

Error validating date '1964-03-31'

---- test date 1965-4-31 - expected false
---- Exception calling validDate: null
---- test date 1954-4-30 - expected true
---- Exception calling validDate: null
Error validating date '1954-4-30'

Error validating date '1954-4-30'

---- test date 1901-5-33 - expected false
---- Exception calling validDate: null
---- test date 1901-5-15 - expected true
---- Exception calling validDate: null
Error validating date '1901-5-15'

Error validating date '1901-5-15'

---- test date 2016-05-31 - expected true
---- Exception calling validDate: null
Error validating date '2016-05-31'

Error validating date '2016-05-31'

---- test date 2006-06-31 - expected false
---- Exception calling validDate: null
---- test date 20016-06-29 - expected false
---- Exception calling validDate: null
---- test date 1934-7-4 - expected true
---- Exception calling validDate: null
Error validating date '1934-7-4'

Error validating date '1934-7-4'

---- test date 2016-07-31 - expected true
---- Exception calling validDate: null
Error validating date '2016-07-31'

Error validating date '2016-07-31'

---- test date 2011-8-19 - expected true
---- Exception calling validDate: null
Error validating date '2011-8-19'

Error validating date '2011-8-19'

---- test date 2111-8-31 - expected false
---- Exception calling validDate: null
---- test date 2011-09-30 - expected true
---- Exception calling validDate: null
Error validating date '2011-09-30'

Error validating date '2011-09-30'

---- test date 2111-9-31 - expected false
---- Exception calling validDate: null
---- test date 2011-10-1 - expected true
---- Exception calling validDate: null
Error validating date '2011-10-1'

Error validating date '2011-10-1'

---- test date 2111-10-31 - expected false
---- Exception calling validDate: null
---- test date 2001-10-31 - expected true
---- Exception calling validDate: null
Error validating date '2001-10-31'

Error validating date '2001-10-31'

---- test date 2111-10-33 - expected false
---- Exception calling validDate: null
---- test date 2111-11-30 - expected false
---- Exception calling validDate: null
---- test date 2013-11-30 - expected true
---- Exception calling validDate: null
Error validating date '2013-11-30'

Error validating date '2013-11-30'

---- test date 2111-11-31 - expected false
---- Exception calling validDate: null
---- test date 2011-12-31 - expected true
---- Exception calling validDate: null
Error validating date '2011-12-31'

Error validating date '2011-12-31'

---- test date 2099-12-31 - expected true
---- Exception calling validDate: null
Error validating date '2099-12-31'

Error validating date '2099-12-31'

最佳答案

如果 m_datePattern 是一个 Pattern,则您使用的compile 不正确。编译的签名是

public static Pattern compile(String regex)

因为它是static,所以它不适用于实例;它通常被称为 like

Pattern.compile(regex)

使用 Pattern 对象而不是类名没有区别。因此,如果 p 是一个 Pattern 对象,那么:

p.compile(regex)

Pattern.compile(regex) 完全相同,即使 pnull。该对象被忽略。

最后,编译返回一个Pattern,这意味着结果必须分配给一个Pattern对象:

pat = Pattern.compile(Regex);

您的代码不会在任何地方分配它。因此,生成的模式就被丢弃了。

最后,当您使用 group(n) 时,从 1 开始的组是捕获组,第一个 (,第二个 ( 等,在正则表达式中。您的正则表达式是

"^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$"

在这个正则表达式中,group(1) 是年份; group(2) 为 19 或 20; group(3) 是月,group(4) 是日。您的代码在月份和日期使用了错误的组。要么更改数字,要么像这样将 (19|20) 指定为 non-capture 组:

"^((?:19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$"

现在它不会被算作捕获组之一。

您的代码中可能还有其他错误。这些只是我注意到的。

关于Java RegEx 日期验证 - 闰年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41916137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com