java - Java 日期验证的正则表达式

标签 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;
        }
    }

最佳答案

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

我想说错误就在这个if中:

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

对于您在ma​​in中提供的情况:

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/

相关文章:

java - 正则表达式数组列表

java - Jackson - 使用 self 引用序列化实体

java - 嵌入 jsp 时,数据库值未显示在 applet 中

c# - 搜索文件内容以查找与正则表达式的匹配项

javascript - 查找并替换引号内的文本,忽略 html 标签

javascript - 使用正则表达式和 jQuery 使输入接受一个字母

java - 将 HQL 子查询转换为 Criteria

java - 关于选择算法

Python re.sub() : how to substitute all 'u' or 'U' s with 'you'

ruby - Ruby 中 gsub 的奇怪行为