Ini pertanyaan sederhana tentang ekspresi reguler, tetapi saya tidak menemukan jawabannya.
Saya ingin menentukan apakah suatu angka muncul secara berurutan tepat dua atau empat kali. Sintaks apa yang dapat saya gunakan?
\d{what goes here?}
Saya mencoba \d{2,4}
, tetapi ungkapan ini menerima tiga digit juga.
abc 123 xyz
? Haruskah itu cocok12
karena persis dua digit berurutan? Atau seharusnya tidak, karena12
merupakan bagian dari deret digit yang lebih besar123
yang panjangnya bukan 2 atau 4? Jika saya harus menebak, saya pikir Anda menginginkan perilaku yang terakhir, tetapi pertanyaan Anda tidak jelas. Contoh dan / atau spesifikasi yang lebih jelas akan membantu. Pertanyaan yang sama untukabc 12345 def
... apa yang harus terjadi di sana?Jawaban:
Tidak ada sintaks khusus untuk itu, tetapi ada banyak cara untuk melakukannya:
(?:\d{4}|\d{2}) <-- alternation: four digits or two \d{2}(?:\d{2})? <-- two digits, and optionally two more (?:\d{2}){1,2} <-- two digits, times one or two
sumber
\d{2}(?:\d{2})?
solusi langsung - variasi bagus dari ini - yang terakhir, khususnya, tampak sangat bagus dan terukur.(?:
ini memulai "grup non-capturing" (grup yang tidak dimaksudkan untuk direferensikan dalam pernyataan ganti). Anda juga bisa menggunakan tanda kurung tetapi ini akan membuat grup penangkap. Rincian lebih lanjut di sini: stackoverflow.com/questions/3512471/non-capturing-group"333"
. Anda mungkin tidak sengaja menggunakan fungsi "temukan substring yang cocok" dari perpustakaan regex, daripada fungsi "periksa apakah string lengkap cocok". Anda harus berkonsultasi dengan dokumentasinya.(?<!\d)(\d{2}|\d{4})(?!\d)
Ini adalah cara yang benar untuk melakukannya. Jawaban yang diterima salah.
Ini akan cocok dengan 3 digit (atau 5). Jadi itu salah di mata saya .
1) Pastikan tidak ada digit sebelum urutan 2, atau 4 digit, atau setelah urutan dua atau empat digit.
(<!)
sintaks terlihat negatif di belakang(?!)
sintaks adalah lookahead negatif.Cara di atas akan berfungsi untuk senar tengah:
Jika string pencarian Anda tidak memiliki konten di sekitarnya Anda bisa menggunakan
^
dan$
memulai dan mengakhiri jangkar tali:^\d{4}$|^\d{2}$
sumber
(?<!\d)(\d{2}|\d{4})(?!\d)
^\d{4}$|^\d{2}$
akan menjadi cara potensial untuk memperbaikinya. Seperti yang akan^\d{2}(?!\d)|^\d{4}(?!\d)