正则表达式Java日期验证

时间:2013-11-08 07:44:18

标签: java regex

使用正则表达式检查日期验证它是如何在日期工作但不是年份?请帮我解决这个问题。

输出:

false
true
false
true

预期产出:

false
false
false
false


public static void main(String args[])
 {   
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "08s21988"));
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "08021s88"));
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "s8021988"));
    System.out.println(dateFormatValidate("ddMMyyyy","^(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[012])((19|20)\\d\\d)?", "0802198s"));        
 }
 public static boolean dateFormatValidate(String format, String regex, String value) {
        try {
            if (value != null && !"".equals(value.trim()) && format != null && !"".equals(format.trim())) 
            {
                if ((regex != null && !"".equals(regex.trim()) && Pattern.matches(regex, value)) || regex != null || "".equals(regex)) 
                {
                    SimpleDateFormat dformat = new SimpleDateFormat(format);
                    dformat.setLenient(false);
                    dformat.parse(value);
                    return true;
                } else
                    return false;
            } else
                return false;
        } catch (Exception e) {     
            return false;
        }
    }

1 个答案:

答案 0 :(得分:1)

@sunleo我不认为它与你的正则表达式有任何关系,因为我刚刚在你提供的这四个日期尝试了你的模式而且它没有捕获任何一个。

我会说错误在if

if ((regex != null && !"".equals(regex.trim()) && Pattern.matches(regex, value)) || regex != null || "".equals(regex)) 
{
               // your code
}

主要

中提供的案例中

regex != null - 所有案例 true

!"".equals(regex.trim()) - 所有案例 true

Pattern.matches(regex, value)) - 所有案例 false

regex != null - 所有案例 true

"".equals(regex)) - 所有案例 false


这给了我们以下if:

if(( true AND true AND false )或 true false

与:

相同

if( false OR true false

在所有情况下都给出了:


<强>真

那么为什么你仍然设法获得两个错误输出?可能会抛出异常:

SimpleDateFormat dformat = new SimpleDateFormat(format);
dformat.setLenient(false);
dformat.parse(value);

因此,在catch语句中,将return false更改为e.printStackTrace();

另外我的建议是首先重新排列这个特定的 if ,然后检查它应该是假的情况(在这个例子中是所有这些)。 怎么样?

首先重新排列如果,然后我将开始调试并检查 if 组件以查看其值以及是否正确计算它们。

另外我认为正则表达式根本不正确(即使它不是错误输出的原因),如果你总是使用 ddMMyyyy 格式且只有19xx / 20xx年,请尝试这种模式:

^(0[1-9]|[1-2][0-9]|3[0-1])(0[1-9]|1[0-2])(19|20)\d{2}$

注意

我没有通过任何IDE检查任何这个(正则表达式除外),因为我在这里没有。