2009-12-06 58 views
2

我曾嘗試:這種模式有什麼正則表達式匹配:22-NOV-09

/^([0-3][0-9])-(A-Za-z)-([0-1][0-9])?$/ 

和我沒有成功。我究竟做錯了什麼?

謝謝大家!

+1

您是否需要正則表達式來驗證日期是否爲有效日期?在這種情況下,我會避免使用這種正則表達式,他們也會匹配39-OTZ-03,這可能不是你想要的。 – 2009-12-06 07:43:38

+0

我絕對同意你 - 事情是我沒有驗證用戶輸入,我確保在解析CSV導入時沒有列偏移問題。它是這種格式中唯一的一列,fastcodejava的答案就像一個魅力! – Drew 2009-12-07 20:15:37

回答

4
/^([0-3][0-9])-([A-Z]{3})-([0-1][0-9])$/ 

編輯: /^(0[1-9]|[1-2][0-9]|3[0-1])-([A-Z]{3})-(0[1-9]|1[0-9])$/

+3

你應該說什麼OP做錯了... – bobbymcr 2009-12-06 07:48:20

1
/^([0-3][0-9])-([A-Za-z]+)-([0-1][0-9])$/ 
1

字符類將用方括號表示。

/^([0-3][0-9])-([A-Za-z]+)-([0-1][0-9])?$/ 
0

刪除該。你可以刪除括號,除非你拉子字符串匹配:

/^([0-3][0-9])-([A-Z][A-Z][A-Z])-([0-1][0-9])$/ 

/^[0-3][0-9]-[A-Z][A-Z][A-Z]-[0-1][0-9]$/ 
3

過於迂腐,這個正則表達式匹配它:22-NOV-09

如果你想要的是要驗證給定的字符串是否是一個特定格式的驗證日期,那麼我建議使用類似strptime的東西。例如:

#define _XOPEN_SOURCE 
#include <time.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    struct tm tm; 
    char *p; 

    p = strptime(argv[1], "%d-%b-%y", &tm); 
    if (p && *p == '\0') { 
     printf("Matches\n"); 
     return 0; 
    } 
    else { 
     printf("Didn't match\n"); 
     return 1; 
    } 
} 

Python有datetime.datetime.strptime,和Perl有POSIX::strptime。我相信大多數其他語言也可以訪問這個功能。