0

正在使用正则表达式检查日期的验证,它如何用于 date 但不适用于 Year ?.请帮我解决这个问题。

输出 :

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

1 回答 1

1

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

我会说错误在于if

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

在您在main中提供的情况下:

regex != null- 所有情况都是真实的

!"".equals(regex.trim())- 所有情况都是真实的

Pattern.matches(regex, value))- 所有情况都是错误的

regex != null- 所有情况都是真实的

"".equals(regex))- 所有情况都是错误的


如果:

if ( ( true AND true AND false ) OR true OR false )

这与以下内容相同:

如果(

在所有情况下都给出:


真的

那么为什么你仍然设法得到两个错误的输出呢?可能这里抛出了异常:

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

因此,在您的catch声明中更改return falsee.printStackTrace();.

另外,我的建议是重新排列这个特定的if首先然后检查它是否应该是错误的情况(在这个例子中是所有的)。如何?

首先重新排列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 检查任何这些(正则表达式除外),因为我这里没有。

于 2013-11-08T08:12:43.753 回答