Java 需要帮助理解为什么这个正则表达式不';行不通

Java 需要帮助理解为什么这个正则表达式不';行不通,java,Java,家庭作业要求我必须编写代码,以yyyy/mm/dd格式验证日期。 它要求我首先检查输入字符串,以便第一部分,年份正好是4个数字,月份介于1和2之间(包括1和2)。如果不符合该条件,我抛出一个名为“InvalidDateException”的异常(我已经为此编写了类) 因此,我给出的示例是2016/05/12应被视为有效日期 研究Regex的工作原理,我得出结论,我需要\\d+,以便java能够找到数字 这是我的代码(variable date是一个字符串,在包含此代码的方法中实例化): int

家庭作业要求我必须编写代码,以yyyy/mm/dd格式验证日期。 它要求我首先检查输入字符串,以便第一部分,年份正好是4个数字,月份介于1和2之间(包括1和2)。如果不符合该条件,我抛出一个名为“InvalidDateException”的异常(我已经为此编写了类)

因此,我给出的示例是
2016/05/12
应被视为有效日期

研究Regex的工作原理,我得出结论,我需要
\\d+
,以便java能够找到数字

这是我的代码(variable date是一个字符串,在包含此代码的方法中实例化):

int yr=date.substring(0,date.indexOf(“/”).length();
int mo=date.substring(date.indexOf(“/”)+1,date.lastIndexOf(“/”).length();
如果(日期匹配(“\\d+”&&(年=4)和(月=1)){
//我把代码放在这里,作为有效日期输出
}
因此,如果我把
2016/05/12
,它应该说这是一个有效日期,但是它会转到我的错误消息“InvalidDateException”

我已经浏览了StackOverflow的其他正则表达式问题,但我似乎无法找到我的代码不起作用的原因


如果您需要进一步进行复杂的验证,请提供任何帮助。

拆分解决方案非常有用

public boolean isDateValid (String date) {
    String[] dateElements = date.split("/");
    if (dateElements.length == 3)
        return isDateElementsValid(dateElements);
    else
        throw new RuntimeException();
}

public boolean isDateElementsValid(String[] dateElements){
    String year = dateElements[0];
    String month = dateElements[1];
    String day = dateElements[2];
    return isYearValid(year) && isMonthValid(month) && isDayValid(day);
}
正则表达式的代码越少越好

public boolean isDateValid (String date) {
    if (date.matches("\\d{4}/\\d{1,2}/\\d{1,2}"))
        return true;
    else
        throw new RuntimeException();
}
*用自定义实现替换RuntimeException。最佳实践是从RuntimeException扩展自定义异常。

示例1 这将为您提供一个直截了当的解决方案,但您仍然需要为其组件解析
字符串

Pattern pattern = Pattern.compile("\\d{4}/\\d{1,2}/\\d{1,2}");
Matcher matcher = pattern.matcher(input);

if (matcher.matches())
{
    // Some code here to extract the year/month/day...
}
例2 更好的方法是将结果分组(使用括号)

例3 更好的方法是命名分组结果

Pattern pattern = Pattern.compile("(?<year>\\d{4})/(?<month>\\d{1,2})/(?<day>\\d{1,2})");
Matcher matcher = pattern.matcher(input);

if (matcher.matches())
{
    int year = Integer.valueOf(matcher.group("year"));   // "year" group
    int month = Integer.valueOf(matcher.group("month")); // "month" group
    int day = Integer.valueOf(matcher.group("day"));     // "day" group

    // Some code here...
}

你必须使用正则表达式吗?没有正则表达式有没有办法做到这一点?为什么不用“/”分割日期并分别检查值?你可以使用
String::split
分割(在“/”上分割),然后评估这三个元素的测试,看看是否是
int
-没关系,我算出了。因此,我所做的是用substring()将年份部分(前4位数字)分割成一个字符串,然后将月份部分分割成另一个子字符串,然后使用
\\d+
检查它们是否是数字。在那之后,它工作正常。感谢所有讽刺性的评论和减号,而不是简单的编辑,以纠正打字错误。好策略!
Pattern pattern = Pattern.compile("(\\d{4})/(\\d{1,2})/(\\d{1,2})");
Matcher matcher = pattern.matcher(input);

if (matcher.matches())
{
    int year = Integer.valueOf(matcher.group(1));  // First group
    int month = Integer.valueOf(matcher.group(2)); // Second group
    int day = Integer.valueOf(matcher.group(3));   // Third group

    // Some code here...
}
Pattern pattern = Pattern.compile("(?<year>\\d{4})/(?<month>\\d{1,2})/(?<day>\\d{1,2})");
Matcher matcher = pattern.matcher(input);

if (matcher.matches())
{
    int year = Integer.valueOf(matcher.group("year"));   // "year" group
    int month = Integer.valueOf(matcher.group("month")); // "month" group
    int day = Integer.valueOf(matcher.group("day"));     // "day" group

    // Some code here...
}
public class Regex {
    private StringBuilder regexBuilder = new StringBuilder();
    private final String input;

    private Regex(String input) {
        this.input = input;
    }

    public static Regex of(String input) {
        return new Regex(input);
    }

    public Regex append(String regex) {
        regexBuilder.append(regex);
        return this;
    }

    public Regex group(String groupName, String regex) {
        regexBuilder.append("(?<")
                    .append(groupName)
                    .append(">")
                    .append(regex)
                    .append(")");

        return this;
    }

    public Matcher matcher() {
        return Pattern.compile(regexBuilder.toString()).matcher(input);
    }
}
final String yearGroup = "year";
final String monthGroup = "month";
final String dayGroup = "day";
Matcher matcher = 
        Regex.of(input)
             .group(yearGroup, "\\d{4}")
             .append("/")
             .group(monthGroup, "\\d{1,2}")
             .append("/")
             .group(dayGroup, "\\d{1,2}")
             .matcher();

if (matcher.matches())
{
    int year = Integer.valueOf(matcher.group(yearGroup));   // "year" group
    int month = Integer.valueOf(matcher.group(monthGroup)); // "month" group
    int day = Integer.valueOf(matcher.group(dayGroup));     // "day" group

    // Some code here...
}