Đối sánh Biểu thức Thông thường để kiểm tra một năm hợp lệ


89

Đưa ra một giá trị mà tôi muốn xác thực nó để kiểm tra xem nó có phải là một năm hợp lệ hay không. Tiêu chí của tôi rất đơn giản trong đó giá trị phải là số nguyên với các 4ký tự. Tôi biết đây không phải là giải pháp tốt nhất vì nó sẽ không cho phép nhiều năm trước 1000và sẽ cho phép nhiều năm như vậy 5000. Tiêu chí này là đủ cho kịch bản hiện tại của tôi.

Điều tôi nghĩ ra là

\d{4}$

Trong khi điều này hoạt động, nó cũng cho phép các giá trị âm.

Làm cách nào để đảm bảo rằng chỉ số nguyên dương mới được phép?


fwiw Tôi đã tạo một dự án node.js, tới-regex-range để tự động tạo các dải này. Nó khó hơn có vẻ nếu bạn cần tạo regex để kiểm tra trong một khoảng thời gian dài.
jonschlinkert

Tại sao giới hạn xác thực của bạn ở 4 chữ số năm? longnow.org
Dan Temple,

Câu trả lời:


76

Bạn cần thêm một neo bắt đầu ^như:

^\d{4}$

Regex của bạn \d{4}$sẽ khớp với các chuỗi kết thúc bằng 4 chữ số . Vì vậy đầu vào như thế nào -1234sẽ được chấp nhận.

Bằng cách thêm neo bắt đầu, bạn chỉ khớp những chuỗi bắt đầu và kết thúc bằng 4 chữ số, có nghĩa là chúng chỉ được chứa 4 chữ số.


2
Chỉ trích! Của tôi thiếu sót đến nỗi nó sẽ được chấp nhận whateverblahblah2323. Bây giờ tôi hiểu tại sao một học chút là nguy hiểm: O
Ranhiru Jude Cooray

62
Điều này sẽ phá vỡ vào năm 10.000.
sferik

16
@sferik: Không thành vấn đề. Người đăng ban đầu cho biết cụ thể anh ấy muốn kiểm tra bốn nhân vật. Anh ta không nói rằng anh ta muốn năm 10.000 là đầu vào hợp lệ, vì vậy việc chấp nhận 10000sẽ là một lỗi.
markusk

4
@sferik: Chương trình sẽ biến mất trong nhiều thế kỷ sau đó. Nếu không, tốt nhất bạn nên lo lắng về 9.000 năm trong tương lai. Theo nguyên tắc của YAGNI, cách tiếp cận là hợp lệ.
Phil

182

Các năm từ 1000 đến 2999

^[12][0-9]{3}$

Cho 1900-2099

^(19|20)\d{2}$

14
Đây là một giải pháp tốt hơn nhiều
mk_89

10
Tôi tốt hơn để sử dụng phi chụp nhóm:^(?:19|20)\d{2}$
Eldar Agalarov

Làm cách nào để xác thực năm có 4 chữ số từ năm 2011 đến năm 2099?
mcquaim

Làm cách nào tôi có thể thêm (19|20)\d{2}vào regex của mình để xác thực định dạng ngày sinh? Đây là regex của tôi /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/tôi muốn đảm bảo rằng năm nay có luôn 4 chữ số và bắt đầu khô héo 19 ** hoặc 20 **
ltdev

Sử dụng ^ (19 | 2 [0-9]) \ d {2} $ cho các năm 1900 - 2999
MarcoZen,

22

Câu trả lời "được chấp nhận" cho câu hỏi này vừa không chính xác vừa không hợp lý.

Nó không chính xác ở chỗ nó sẽ khớp với các chuỗi như 0001, không phải là năm hợp lệ.

không phù hợp ở chỗ nó sẽ không khớp với bất kỳ giá trị nào trên 9999. Chúng ta đã quên các bài học của Y2K chưa? Thay vào đó, hãy sử dụng biểu thức chính quy:

^[1-9]\d{3,}$

Nếu bạn cần đối sánh các năm trong quá khứ, ngoài các năm trong tương lai, bạn có thể sử dụng biểu thức chính quy này để đối sánh với bất kỳ số nguyên dương nào:

^[1-9]\d*$

Ngay cả khi bạn không mong đợi các ngày trong quá khứ, bạn vẫn có thể muốn sử dụng cụm từ thông dụng này, đề phòng trường hợp ai đó phát minh ra cỗ máy thời gian và muốn lấy lại phần mềm của bạn.

Lưu ý: Biểu thức chính quy này sẽ khớp với tất cả các năm, kể cả những năm trước năm 1, vì chúng thường được biểu diễn bằng ký hiệu BC thay vì số nguyên âm. Tất nhiên, quy ước này có thể thay đổi trong vài thiên niên kỷ tới, vì vậy lựa chọn tốt nhất của bạn là so khớp bất kỳ số nguyên nào — dương hoặc âm — với biểu thức chính quy sau:

^-?[1-9]\d*$

3
Không, có thể sẽ không. Nhưng một người nào đó (nhà khảo cổ học? Nhà sử học?) Có thể cần phải khớp số năm với 8000 năm trước. : D Và Doc Brown có thể cần nó ...
Jaime

1
i sử dụng này để phạm vi giới hạn từ 1000-9999 ^ [1-9] \\ d {3} $ Thats vì việc áp dụng chúng ta phải cung cấp dữ liệu, chấp nhận 4 số chữ số chỉ :(
MatPag

Câu trả lời tuyệt vời. Tôi cũng sẽ thực hiện như sau để chấp nhận năm 0: ^ (-? [1-9] \ d * | 0) $
Kosta Kontos

10

Điều này hoạt động từ năm 1900 đến 2099:

/(?:(?:19|20)[0-9]{2})/

đối với tôi có vẻ như nó sẽ chỉ đến năm 2099. BTW OP đang yêu cầu làm thế nào để chỉ cho phép số có 4 chữ số dương.
DeanOC

bah, ý tôi là năm 2099. cảm ơn. và bây giờ tôi thấy phần số nguyên dương.
jonschlinkert

Tôi tạo ra một dự án, to-regex tầm xa để tự động tạo ra các phạm vi này
jonschlinkert

5

Dựa trên câu trả lời @ r92, trong các năm 1970-2019:

(19[789]\d|20[01]\d)

Câu trả lời của bạn cho phép197999
avalanche 1

Tôi không nghĩ nó có ... Phần đầu tiên của regex khớp với số bắt đầu bằng 19, sau đó là bất kỳ trong số 7,8 hoặc 9, tiếp theo là số DUY NHẤT. Regex 19[789]\d\d\dsẽ cho phép197999
Renaud

1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
avalanche 1

có, nó sẽ khớp với 4 số đầu tiên ( 1970), không phải số cuối cùng là 3. Còn về (19[789]\d|20[01]\d)[^0-9]thì sao? Điều đó sẽ phù hợp 1970 324nhưng không1970324
Renaud

1
Tôi thấy điều này hữu ích để tìm năm phim từ tên tệp ... trong trường hợp này, chúng tôi muốn nội dung từ những năm 1930 trở đi ... nhưng sau đó chúng tôi loại trừ 1024 được thêm vào cuối để có chất lượng video
Adrian Hum

2

Về lý thuyết, tùy chọn 4 chữ số là đúng. Nhưng trên thực tế, có thể tốt hơn nếu có dải 1900-2099.

Ngoài ra, nó cần phải là nhóm không bắt. Nhiều bình luận và câu trả lời đề xuất chụp nhóm không đúng IMHO. Bởi vì để so khớp nó có thể hoạt động, nhưng để trích xuất các kết quả phù hợp bằng regex, nó sẽ trích xuất các số có 4 chữ số và các số có hai chữ số (19 và 20) cũng do có dấu ngoặc kép.

Điều này sẽ hoạt động để đối sánh chính xác bằng cách sử dụng các nhóm không chụp:

(?:19|20)\d{2}


1

bạn có thể đi với sth như [ ^-]\d{4}$: bạn ngăn dấu trừ -trước 4 chữ số của bạn.
bạn cũng có thể sử dụng ^\d{4}$with ^để bắt đầu chuỗi. Nó phụ thuộc vào kịch bản của bạn thực sự ...


1

Để kiểm tra một năm trong một chuỗi chứa các từ khác cùng với năm, bạn có thể sử dụng regex sau: \ b \ d {4} \ b


Đây chính xác là những gì tôi cần, câu trả lời được chấp nhận dường như không phải là PCRE hợp lệ.
Prometheus


0

Bạn có thể chuyển đổi số nguyên của mình thành một chuỗi. Vì dấu trừ sẽ không khớp với các chữ số, bạn sẽ không có năm âm.


0

Tôi sử dụng regex này trong Java ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

Hoạt động từ 1900 đến 9999


0

/ ^ \ d {4} $ / Điều này sẽ kiểm tra xem một chuỗi chỉ bao gồm 4 số hay không. Trong trường hợp này, để nhập năm 989, bạn có thể nhập 0989.


0

Nếu bạn cần đối sánh YYYY hoặc YYYYMMDD, bạn có thể sử dụng:

^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$

0

Bạn cũng có thể sử dụng cái này.

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)

Họ chỉ muốn khớp với năm. Hơn nữa, regex của bạn khớp 00/00/2000hoặc 31/02/1999và nhiều ngày sai khác.
Toto

Có thể giúp bạn ([0-2] [0-9] | 3 [0-1]) \ / ([0-1] [0-2]) \ / (19 [789] \ d | 20 [01 ] \ d)
Ranjeet Chouhan

(0[1-9]|1[0-2])là một biểu hiện tốt hơn nhiều cho tháng
EZ-C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.