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