家庭作业说我必须编写以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上的其他正则表达式问题,但我似乎无法找出为什么我的代码不起作用。
感谢任何帮助
答案 0 :(得分:2)
这将为您提供直接的解决方案,但您仍需要解析PeriodIndex
的组件。
String
更好的方法是对结果进行分组(带括号)。
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...
}
更好的方法是命名分组结果。
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);
}
}
答案 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扩展自定义异常。