需要帮助了解为什么此正则表达式不起作用

时间:2018-03-28 00:33:23

标签: java

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

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

看看正则表达式是如何工作的,我得出的结论是我需要\\d+以便java可以找到数字。

这是我的代码(变量日期是一个String,在包含此代码的方法中实例化):

int yr = date.substring(0, date.indexOf("/")).length();
int mo = date.substring(date.indexOf("/")+1, date.lastIndexOf("/")).length();

if (date.matches("\\d+") && (yr == 4) && (mo <= 2 && mo >= 1)) {
//I've put code here that outputs it as a valid date
}

那么如果我放2016/05/12,它应该说它是一个有效的日期,但它转到我的错误消息“InvalidDateException”

我已经查看了StackOverflow上的其他正则表达式问题,但我似乎无法找出为什么我的代码不起作用。

感谢任何帮助

2 个答案:

答案 0 :(得分:2)

示例1

这将为您提供直接的解决方案,但您仍需要解析PeriodIndex的组件。

String

示例2

更好的方法是对结果进行分组(带括号)。

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...
}

示例3

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

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...
}

例4.a

您可以使用正则表达式构建器类。这是有益的,因为它具有一些可重用性。

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...
}

例4.b

使用构建器...

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);
    }
}

答案 1 :(得分:-1)

如果您需要进行更复杂的验证,拆分解决方案是很好的。

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扩展自定义异常。