【问题标题】:Using Regex in String.matches in java to match a date format在java中使用String.matches中的Regex来匹配日期格式
【发布时间】:2015-10-19 07:45:36
【问题描述】:

根据 dd/mm/yyyy 格式验证给定日期。
有效 = 1
无效 = -1
示例 1:
输入 = 12/06/1987
输出=1
示例 2:
输入 = 03/1/1987
输出=-1

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CheckDateFormat {
    public static void main(String[] args) {
        String s1="29/02/2006";
        getvalues(s1);
    }
    public static void getvalues(String s1) {
        if(s1.matches("[0-9]{2}[/][0-9]{2}[/][0-9]{4}"))
        {
            SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
            sdf.setLenient(false);
            try {
                Date d1=sdf.parse(s1);
                System.out.println(1);
            } catch (ParseException e) {
                //e.printStackTrace();//Always going to catch block
                System.out.println(-1);
            }
        }
        else
            System.out.println(-1);
    }
}


代码的问题在于它总是返回 -1。
它总是进入 catch 块并给出 ParseException。
正则表达式有什么问题吗?

【问题讨论】:

  • 你应该自己做作业。搜索在线正则表达式测试人员并在那里尝试
  • 您还混淆了“退货”和“打印”。你还应该告诉你的老师,Java 有一个布尔类型,在这里应该使用它而不是 1/-1。因为2006年2月只有28天,所以进入catch块,所以29/02/2006这个日期是无效的。
  • 您是要验证日期还是只验证格式?如果您严格验证日期,那么您得到的异常是正确的,因为 29/02/2006 是无效的。

标签: java regex string date-format simpledateformat


【解决方案1】:

问题是这一行:

sdf.setLenient(false);

还有这个日期:

String s1="29/02/2006";

由于2006 不是闰年,因此您的日期无效并且 lenient 设置为 false 日期解析调用失败并抛出 ParseException

如果您注释掉sdf.setLenient(false); 行,问题将得到解决:

或使用有效日期:

String s1="29/02/2008";

由于2008 是闰年,因此 2 月 29 日为有效日期。

【讨论】:

  • 是的,它确实有效。问题在于闰年日期。必须从我的错误中学习。谢谢
  • 对不起朋友,我还没有 15 声望,所以不能投票。我会尽快标记它。再次感谢您
  • 不,您不需要 15 次代表即可接受答案。单击我在上面评论中提供的链接以查看如何接受答案。你只需要点击我答案左上角的勾号,它就会变成绿色。您还将获得 2 分。
【解决方案2】:

您不需要正则表达式。如果你得到ParseException,你可以return -1,否则你return 1

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CheckDateFormat {
    public static void main(String[] args) {
        String s1="29/02/2006";
        System.out.println(getvalues(s1));
    }
    public static int getvalues(String s1) {
        SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(false);
        try {
            Date d1=sdf.parse(s1);
            System.out.println(1);
        } catch (ParseException e) {
            return -1;
        }
        return 1;
    }
}

【讨论】:

    【解决方案3】:

    由于以下行引发异常。把它注释掉。

    sdf.setLenient(false);

    【讨论】:

      【解决方案4】:

      由于 2006 年不是闰年,使用 String s1="29/02/2006"; 将引发解析异常。

      尝试使用其他日期,它会正常工作。

      【讨论】:

        猜你喜欢
        • 2016-06-26
        • 2015-01-23
        • 2016-07-19
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多