2009-08-31 33 views
13

Tôi đang cố gắng xác thực ngày được nhập vào một hộp văn bản. Có một mặt nạ đầu vào trên hộp văn bản mà lực lượng đầu vào của xx/xx/xxxx. Tôi đang cố gắng sử dụng trình xác nhận biểu thức chính quy để thực thi một ngày chính xác được nhập. Tôi không có kỹ năng trong RegEx cơ bản ở tất cả. Đồng nghiệp của tôi tìm thấy cái này trên internet nhưng tôi thực sự không thể biết nó đang làm gì.C# Regular Expression để xác thực ngày?

Điều này có đúng không? Có vẻ quá phức tạp ...

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

Có ai biết biểu hiện phức tạp hơn về cơ bản những gì tôi cần không?

+0

Điều này đã được giải quyết trong bài đăng [this] (http://stackoverflow.com/questions/669741/date-regex). Xem nếu nó giúp. – JYelton

Trả lời

34

Tại sao không sử dụng một trong các phương pháp có sẵn trong System.DateTime namespace? Bạn có thể sử dụng DateTime.TryParse() (chỉnh sửa:DateTime.TryParseExact() có lẽ là đề xuất phù hợp) để thực hiện xác thực.

+1

Đồng ý, hãy để khuôn khổ này kéo trọng lượng lên cái này. –

+4

Và DateTime.TryParseExact() có thể phù hợp hơn tùy thuộc vào nhu cầu chính xác của bạn. –

+0

Điều gì xảy ra nếu tôi muốn đảm bảo ngày chính xác tại nút bấm? – Muhammedh

20

Bạn có thể sử dụng DateTime.TryParseExact:

DateTime dt; 

bool isValid = DateTime.TryParseExact(
    "08/30/2009", 
    "MM/dd/yyyy", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out dt); 
-1

Đây không phải là thực sự là một câu trả lời, nhưng không thể bạn sử dụng DateTime.Parse hoặc DateTime.TryParse để kiểm tra xem ngày là đúng?

Hoặc là hoặc sử dụng điều khiển DateTime để đảm bảo không thể nhập dữ liệu không phải là Ngày giờ. Có rất nhiều JavaScript trên đó về chủ đề này.

3

Kettenbach gặp sự cố. Đồng nghiệp của anh đề nghị sử dụng regex. Kettenbach sau đó đã có hai vấn đề.

Như những người khác đã nói, sử dụng DateTime.TryParse hoặc DateTime.TryParseExact trên một validator tùy chỉnh và tiết kiệm cho mình những cơn ác mộng đó là regex :)

+0

Regex không phải là điều xấu xa. Tuy nhiên, chúng cần phải được sử dụng một cách thận trọng. Họ làm việc tuyệt vời cho một lớp học nhất định của các vấn đề phân tích cú pháp văn bản. – TrueWill

+3

ồ tôi không bao giờ nói họ là ác, mỗi lần nói ... Nhưng họ đang ở trên một mức độ với mèo. – Sk93

+0

Vui lòng ghi rõ tuyên bố trên cho Jamie Zawinski. – jason

-1

câu trả lời cuối thực sự là con đường đúng để làm. Sử dụng DateTime.TryParse.

Ví dụ:

DateTime dt; 
if(DateTime.TryParse(Textbox1.Text,out dt)) 
{ 
Label1.Text = "Invalid date format"; 
} 
+1

Tôi đã viết mã thực tế cho nó. – wwd

+1

TryParse thực sự trả về true nếu phân tích cú pháp thành công, vì vậy thông báo của bạn về định dạng ngày không hợp lệ phải nằm trong trạng thái khác của điều kiện đó. –

3

Các biểu hiện thường xuyên trên là chính xác cho định dạng dd/mm/yyyy. biểu thức là

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

Tôi tin rằng câu hỏi là "có cách nào tốt hơn" ... – iMortalitySX

7

Đây sẽ là đúng biểu thức chính quy để sử dụng cho định dạng ngày dd/mm/yyyy

^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$ 
+4

Không chính xác - bạn cần đặt số 0 ban đầu tùy chọn hoặc nó sẽ không khớp với các giá trị ngày có chữ số duy nhất như 2/12/2012. ^ (0? [1-9] | [12] [0-9] | 3 [01]) [- /.](0[1-9]|1[012])[- /.] (19 | 20) \ d \ d $ – 5arx

3

Là một thay thế, bạn có thể sử dụng CompareValidator thay vì RegularExpressionValidator. Nó đi như thế này:

<asp:CompareValidator ID="CompareValidator2" runat="server" ControlToValidate="txtIssueDate" ErrorMessage="Invalid Date Format" Type="Date" Operator="DataTypeCheck" Display="Dynamic" Text="*" ForeColor="Red" ValidationGroup="valGroup1"></asp:CompareValidator>

+0

Ý tưởng hay. Bạn vừa mới cứu tôi khỏi việc sử dụng Regex. – Cyberherbalist

0

Chúng ta có thể sử dụng một CustomValidator và sử dụng ghi đè phương pháp ServerValidate để kiểm tra TryParse!

0
([0][1-9]|[1][0-9|][2][0-9]|[3][0-1])\/([0][1-9]|[1][0-2])\/[1-2][0-9][0-9][0-9] 

cho dd/mm/yyyy (năm có thể 1000-2999)

hoặc

(([0] [1-9] | [2] [0-9] | [3] [0-1] | [1-9] | [1] [0-9])/([0] [1-9] | [1] [0-2] | [1-9])/([1-2] [0-9] [0-9] [0-9] | [0-9] [0-9]))

bao gồm d/m/yy (ví dụ 1/12/82)

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