Diberikan nilai, saya ingin memvalidasinya untuk memeriksa apakah itu tahun yang valid. Kriteria saya sederhana dimana nilainya harus berupa integer dengan 4
karakter. Saya tahu ini bukan solusi terbaik karena tidak akan memungkinkan bertahun-tahun sebelumnya 1000
dan akan memungkinkan tahun-tahun seperti itu 5000
. Kriteria ini cukup untuk skenario saya saat ini.
Apa yang saya pikirkan adalah
\d{4}$
Sementara ini berhasil, ini juga memungkinkan nilai negatif.
Bagaimana cara memastikan bahwa hanya bilangan bulat positif yang diperbolehkan?
regex
string
validation
string-matching
Ranhiru Jude Cooray
sumber
sumber
Jawaban:
Anda perlu menambahkan jangkar awal
^
sebagai:^\d{4}$
Regex Anda
\d{4}$
akan cocok dengan string yang diakhiri dengan 4 digit . Jadi masukan suka-1234
akan diterima.Dengan menambahkan jangkar awal, Anda hanya mencocokkan string yang dimulai dan diakhiri dengan 4 digit, yang secara efektif berarti harus berisi hanya 4 digit.
sumber
whateverblahblah2323
. Sekarang saya mengerti mengapa sedikit belajar itu berbahaya: O10000
akan menjadi bug.Tahun dari 1000 hingga 2999
^[12][0-9]{3}$
Untuk 1900-2099
sumber
^(?:19|20)\d{2}$
(19|20)\d{2}
regex saya untuk memvalidasi format tanggal lahir? Ini regex saya,/^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/
saya ingin memastikan bahwa tahun selalu 4 digit dan dimulai dengan 19 ** atau 20 **Jawaban yang "diterima" untuk pertanyaan ini salah dan rabun.
Itu tidak benar karena akan cocok dengan string seperti
0001
, yang bukan merupakan tahun yang valid.Hal ini di rabun bahwa hal itu akan tidak sesuai dengan nilai setiap atas 9999. Memiliki kita sudah lupa pelajaran dari Y2K ? Sebagai gantinya, gunakan ekspresi reguler:
^[1-9]\d{3,}$
Jika Anda perlu mencocokkan tahun-tahun yang lalu, selain tahun-tahun mendatang, Anda dapat menggunakan persamaan reguler ini untuk mencocokkan bilangan bulat positif mana pun:
^[1-9]\d*$
Bahkan jika Anda tidak mengharapkan tanggal dari masa lalu, Anda mungkin ingin menggunakan ekspresi reguler ini, untuk berjaga-jaga jika seseorang menemukan mesin waktu dan ingin membawa kembali perangkat lunak Anda.
Catatan: Ekspresi reguler ini akan cocok dengan semua tahun, termasuk yang sebelum tahun 1, karena mereka biasanya diwakili dengan sebutan BC dan bukan bilangan bulat negatif. Tentu saja, konvensi ini dapat berubah selama beberapa milenium ke depan, jadi opsi terbaik Anda adalah mencocokkan bilangan bulat apa pun — positif atau negatif — dengan ekspresi reguler berikut:
^-?[1-9]\d*$
sumber
Ini berfungsi untuk tahun 1900 hingga 2099:
/(?:(?:19|20)[0-9]{2})/
sumber
Berdasarkan jawaban @ r92, selama tahun 1970-2019:
(19[789]\d|20[01]\d)
sumber
197999
19[789]\d\d\d
akan memungkinkan197999
/(19[789]\d|20[01]\d)/.test(1970324) >> true
1970
), bukan 3 terakhir. Bagaimana(19[789]\d|20[01]\d)[^0-9]
? Itu akan cocok1970 324
tetapi tidak1970324
Untuk menguji satu tahun dalam string yang berisi kata lain beserta tahun, Anda dapat menggunakan regex berikut: \ b \ d {4} \ b
sumber
Secara teori, opsi 4 digit adalah benar. Namun dalam praktiknya mungkin lebih baik memiliki rentang 1900-2099.
Selain itu, perlu grup non-penangkap. Banyak komentar dan jawaban mengusulkan pengelompokan menangkap yang IMHO tidak tepat. Karena untuk mencocokkan mungkin berhasil, tetapi untuk mengekstrak kecocokan menggunakan regex akan mengekstrak 4 digit angka dan dua digit (19 dan 20) angka juga karena tanda kurung.
Ini akan berfungsi untuk pencocokan tepat menggunakan grup non-penangkap:
(?:19|20)\d{2}
sumber
Anda bisa menggunakan sth seperti [
^-]\d{4}$
: Anda mencegah tanda minus-
berada sebelum 4 digit Anda.Anda juga bisa menggunakan
^\d{4}$
with^
untuk menangkap awal string. Itu tergantung pada skenario Anda sebenarnya ...sumber
Menggunakan;
selama tahun 1900 - 9999.
Tidak perlu khawatir untuk 9999 dan seterusnya - AI akan melakukan semua pemrograman saat itu !!! Hehehehe
Anda dapat menguji regex Anda di https://regex101.com/
Juga info lebih lanjut tentang non-capturing groups (disebutkan dalam salah satu komentar di atas) di sini http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm
sumber
Anda bisa mengubah integer Anda menjadi string. Karena tanda minus tidak akan cocok dengan angka-angka tersebut, Anda tidak akan memiliki tahun-tahun negatif.
sumber
Saya menggunakan regex ini di Java
^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$
Bekerja dari 1900 hingga 9999
sumber
/ ^ \ d {4} $ / Ini akan memeriksa apakah string hanya terdiri dari 4 angka. Dalam skenario ini, untuk memasukkan tahun 989, Anda dapat memberikan 0989 sebagai gantinya.
sumber
Jika Anda perlu mencocokkan YYYY atau YYYYMMDD, Anda dapat menggunakan:
^((?:(?:(?:(?:(?:[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})$
sumber
Anda juga bisa menggunakan yang ini.
([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
sumber
00/00/2000
atau31/02/1999
dan banyak lagi tanggal palsu.(0[1-9]|1[0-2])
adalah ekspresi yang jauh lebih baik untuk bulan iniDalam kasus saya, saya ingin mencocokkan string yang diakhiri dengan satu tahun (4 digit) seperti ini misalnya:
Oct 2020 Nov 2020 Dec 2020 Jan 2021
Ini akan kembali
true
dengan yang ini:var sheetName = 'Jan 2021'; var yearRegex = new RegExp("\\d{4}$"); var isMonthSheet = yearRegex.test(sheetName); Logger.log('isMonthSheet = ' + isMonthSheet);
Kode di atas digunakan dalam Apps Script .
sumber
Oct 2020
tetapi jugaOct 20202
,Oct20202