2010-10-15 31 views
8

Cần trợ giúp tìm kiếm hoặc có RegEx khớp với định dạng MM/YY hoặc MM/YYYY. RegExFu của tôi là yếu và tôi thậm chí không chắc chắn nơi để bắt đầu viết này.RegEx để phù hợp với định dạng M/YYYY, MM/YYYY, M/YY hoặc MM/YY

Số tháng phải là 1-12, năm, bất kỳ điều gì vượt quá năm 2009 đều hợp lệ. Xin lỗi vì không đề cập thêm chi tiết trước đây. Điều này được sử dụng như một ngày hết hạn.

Tôi sẽ thêm tiền thưởng cho bất kỳ ai đi lên trên và vượt ra ngoài và xác thực định dạng MM/YY hoặc MM/YYYY là> = ngày hôm nay. Không có ý nghĩa cho phép công cụ hết hạn qua lớp xác nhận đầu tiên.


tôi cảm thấy xấu kể từ khi tôi thay đổi các yêu cầu của tôi và phải được cụ thể hơn trong những gì tôi cần giữa câu hỏi vì vậy tôi sẽ hào phóng giải thưởng cho tất cả những người đã trả lời một khi không có tiền thưởng cửa sổ hết hạn.

+0

Bạn sẽ thích http://www.regular-expressions.info/ để được hướng dẫn và http://weitz.de/regex-coach/ để dùng thử. (\ d \ d)/(\ d \ d) là khởi đầu cho mm/yy. Sry, tôi hiện đang quá lười biếng cho phần còn lại. – gimpf

+0

Nếu bạn đang có kế hoạch cho phép người dùng nhập '2 chữ số năm', tôi không khuyến cáo điều đó. Thường xuyên thích '4 chữ số' (đầy đủ chữ số). – BrunoLM

+0

@BrunoLM, API cũng tôi đang làm việc với chấp nhận định dạng MM/YY vì vậy bất kỳ perk nhỏ nào tôi có thể cung cấp cho người dùng của mình. – jfar

Trả lời

11

gì về

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

Matches tháng

// 10 to 12 | 01 to 09 | 1 to 9 
(1[0-2]|0[1-9]|\d) 

Và năm

// 2000 to 2099 | 1900 to 1999 
// 01 to 09 | 10 to 99 
(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d) 

Để phù hợp với bất cứ điều gì >= 2010

/^(1[0-2]|0[1-9]|\d)\/([2-9]\d[1-9]\d|[1-9]\d)$/; 

Kết quả:

12/2009 : false 
1/2010 : true 
12/2011 : true 
12/9011 : true 
12/07 : false 
12/17 : true 
+0

@Bruno, đó là câu trả lời cơ bản của tôi. – Brad

+1

Có lý do nào khiến bạn loại trừ năm '00' không? Nó có thể không phải là thực hành tốt để sử dụng vì nó là loại khó hiểu, nhưng có vẻ như nó vẫn hoàn toàn hợp lệ. Hoặc C# không cho phép điều đó cho các định dạng ngày? – eldarerathis

+0

@eldarerathis: OP không nói những gì ông mong đợi. Tôi quyết định loại trừ '00' vì nó có vẻ mơ hồ với tôi. '00' là '1900' hoặc' 2000'? Dù sao, đây chỉ là một ví dụ. Những gì tôi đề nghị là sử dụng '4 chữ số' luôn. – BrunoLM

4

Hãy thử điều này:

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

ép đến tháng thực tế (1-12) và năm 1900-2199.

+0

Hhm khoảng 10/100: /? –

+0

mục này khớp với "MM/YYY". –

+0

@klausbyskov, tôi đã cập nhật nó chính xác hơn. – Brad

5

Hãy thử:

var re = new Regex(@"(?<month>\d{2})/(?<year>\d{2}|\d{4})"); 
var month = re.Match(yourString).Groups["month"]; 
... 

Một cách khác là:

if(dateStr.Length == 5) 
    myDateTime = DateTime.ParseExact("MM/YY", dateStr); 
else 
    myDateTime = DateTime.ParseExact("MM/YYYY", dateStr); 
+0

điều này cho phép tháng là 54. – Brad

+0

Cảm ơn bạn đã chỉ ra ParseExact. Điều đó làm cho xác thực của tôi tốt hơn nữa. – jfar

+0

[ParseExact] (http://msdn.microsoft.com/en-us/library/332de853.aspx) có thể lấy một mảng các định dạng, tốt hơn nhiều so với regex. – Kobi

0

@BrunoLM,

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

khớp với "0/2009". Tôi có thể đề xuất một cải tiến nhỏ:

^(1[0-2]|0[1-9]|[1-9])\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 
Các vấn đề liên quan