2012-06-07 67 views
5

Tôi không phải là chuyên gia viết các biểu thức chính quy, vì vậy cần sự giúp đỡ của bạn. Tôi muốn xác thực ngày ở định dạng "dd-MMM-yyyy" tức là từ ngày 7 tháng 6 năm 2012. Tôi đang sử dụng RegularExpressionValidator trong asp.net.Cần biểu thức chính quy để xác thực ngày theo định dạng dd-MMM-yyyy

Ai đó có thể giúp tôi cung cấp biểu thức không?

Cảm ơn bạn đã chia sẻ thời gian của mình.

+1

đâu là dữ liệu đến từ - nếu người dùng nhập chắc chắn tốt hơn để sử dụng một lĩnh vực ngày để xác nhận đầy đủ nó -Có một regex sẽ không nắm bắt chính xác 29 tháng hai vv – Mark

+0

Bạn chỉ muốn ngày hợp lệ cú pháp hoặc bạn có muốn ngày thực tế hợp lệ? Ví dụ, regex có nên từ chối ngày 30 tháng 2 năm 2012 vì đó là một ngày không thể? – BunjiquoBianco

+0

Tôi chỉ cần ngày tháng hợp lệ, mặc dù nó sẽ tốt hơn nếu regex hoàn toàn xác nhận nó. – IrfanRaza

Trả lời

18

Sử dụng DatePicker có lẽ là cách tiếp cận tốt nhất. Tuy nhiên, vì đó không phải là những gì bạn hỏi, đây là một tùy chọn (mặc dù nó là trường hợp nhạy cảm):

^(([0-9])|([0-2][0-9])|([3][0-1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-\d{4}$ 

Bên cạnh đó, đây là một nơi bạn có thể dễ dàng kiểm tra Regular Expressions: http://www.regular-expressions.info/javascriptexample.html

+0

Cảm ơn Mark, Công việc của nó. – IrfanRaza

+0

tốt để xem liên kết để kiểm tra Cụm từ thông dụng –

4

Regex không có số 0 đứng đầu trong ngày.

^\d{1,2}-[a-zA-Z]{3}-\d{4}$ 

Cập nhật Regex với hàng đầu zero trong ngày.

^\d{2}-[a-zA-Z]{3}-\d{4}$ 
+0

'\ d' có nghĩa là bất kỳ chữ số nào, vì vậy chữ đầu tiên chấp nhận ' 0 'và' 88 'làm ngày. Ngoài ra '[a-zA-Z] {3}' khớp với "xYz". –

+0

Cảm ơn hoàn hảo @Leonov Mikhail – Rauld

3

Nó không regex, nhưng bạn có thể sử dụng xây dựng trong DateTime.TryParseExact chức năng để xác nhận chuỗi datetime bạn

DateTime dateTime; 
string toValidate = "01-Feb-2000"; 

bool isStringValid = DateTime.TryParseExact(
    toValidate, 
    "dd-MMM-yyyy", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out dateTime); 
+0

+1 để tránh regex và các giới hạn của nó. – Junuxx

0

Tuy nhiên, ý tưởng khác là để thử này (tương tự như ý tưởng user1441894 của):

var x = DateTime.Parse("30-Feb").GetDateTimeFormats(); 

Tôi đã học cách sử dụng ngày hôm qua (cho một mục đích khác). Vì vậy, try-catch bản Tuyên Bố này để đối phó với hiệu lực/vô hiệu kể từ ngày :)

-1
using System.Text.RegularExpressions 

private void fnValidateDateFormat(string strStartDate,string strEndDate) 
{ 
    Regex regexDt = new Regex("(^(((([1-9])|([0][1-9])|([1-2][0-9])|(30))\\-([A,a][P,p][R,r]|[J,j][U,u][N,n]|[S,s][E,e][P,p]|[N,n][O,o][V,v]))|((([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))\\-([J,j][A,a][N,n]|[M,m][A,a][R,r]|[M,m][A,a][Y,y]|[J,j][U,u][L,l]|[A,a][U,u][G,g]|[O,o][C,c][T,t]|[D,d][E,e][C,c])))\\-[0-9]{4}$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-8]))\\-([F,f][E,e][B,b])\\-[0-9]{2}(([02468][1235679])|([13579][01345789]))$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-9]))\\-([F,f][E,e][B,b])\\-[0-9]{2}(([02468][048])|([13579][26]))$)"); 

    Match mtStartDt = Regex.Match(strStartDate,regexDt.ToString()); 
    Match mtEndDt = Regex.Match(strEndDate,regexDt.ToString()); 
    if (mtStartDt.Success && mtEndDt.Success) 
    { 
      //piece of code 
    } 
} 
0
"^(([1-9]|0[1-9]|1[0-9]|2[1-9]|3[0-1])[-]([JAN|FEB|MAR|APR|MAY|JUN|JULY|AUG|SEP|OCT|NOV|DEC])[-](d{4}))$" 
+0

Bao gồm tóm tắt về mã/giải pháp sẽ làm cho câu trả lời này trở thành một câu trả lời hoàn chỉnh! –

1

Các giải pháp chấp nhận cho phép '00' là ngày, vì vậy đây là một sửa chữa cho rằng:

^(([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-\d{4}$ 

Ghi chú/ngoại lệ:

1.Hãy biết các vấn đề về độ nhạy của chữ hoa. Ví dụ. 'DEC' sẽ không vượt qua trong khi 'Dec' sẽ qua. Bạn có thể muốn chuyển đổi chuỗi regex và chuỗi kiểm tra thành chữ thường trước khi kiểm tra (nếu ứng dụng của bạn cho phép).

2.This sẽ không bắt ngày không tồn tại, giống như ngày 30 tháng 2, ngày 31 tháng sáu vv

Các vấn đề liên quan