簡體   English   中英

用於Java日期驗證的正則表達式

[英]Regex for Java Date validation

我是否正在使用正則表達式檢查日期的有效性,但不適用於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;
        }
    }

@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)) -所有情況均為

regex != null所有情況都為true

"".equals(regex)) -所有情況均為


在以下情況下,我們可以得到以下結果:

如果(( true AND true AND false )OR true OR false

與以下內容相同:

如果( falsetruefalse

在所有情況下都可以:


真正

那么,為什么仍然設法得到兩個錯誤的輸出呢? 可能在這里引發了異常:

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

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

同樣,我的建議是, 如果要先重新排列此特定內容然后再檢查應該為假的情況(在此示例中為所有情況)。 怎么樣?

首先重新排列然后從調試開始,檢查是否有組件以查看其值以及是否正確計算了它們。

同樣,我認為正則表達式根本不正確(即使這不是導致錯誤輸出的原因),如果您始終使用ddMMyyyy格式且只有19xx / 20xx年,請嘗試以下模式:

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

注意

我沒有通過任何IDE檢查過任何此項(正則表達式除外),因為我在這里沒有任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM