正在使用正则表达式检查日期验证,它对日期有效但不适用于年份? .请帮我解决这个问题。
输出:
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;
}
}
最佳答案
@sunleo 我认为这与您的正则表达式没有任何关系,因为我刚刚在您提供的这四个日期上尝试了您的模式,但它没有捕获其中的任何一个。
我想说错误就在这个if
中:
if ((regex != null && !"".equals(regex.trim()) && Pattern.matches(regex, value)) || regex != null || "".equals(regex))
{
// your code
}
<小时/>
对于您在main中提供的情况:
regex != null
- 所有情况true
!"".equals(regex.trim())
- 所有情况true
Pattern.matches(regex, value))
- 所有情况false
regex != null
- 所有情况true
"".equals(regex))
- 所有情况false
这给了我们以下如果:
if ((true AND true AND false) OR true OR false> )
这与:
相同如果(假或真或假)
在所有情况下给出:
<小时/>正确
那么为什么你仍然设法得到两个错误输出呢?可能这里抛出了异常:
SimpleDateFormat dformat = new SimpleDateFormat(format);
dformat.setLenient(false);
dformat.parse(value);
因此,在您的 catch
语句中,将 return false
更改为 e.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 检查这些内容(正则表达式除外),因为我这里没有。
关于java - Java 日期验证的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19853906/