Membatasi Keserakahan dalam Regex di JavaScript
Ekspresi reguler secara default bersifat serakah (greedy). Ini berarti mereka akan mengambil jumlah karakter sebanyak mungkin. Mari kita lihat contohnya. Misalkan kita memiliki string seperti ini:
let str = 'aeeex zzz x kkk';
Misalkan kita ingin menemukan substring
'aeeex' dalam string ini dengan pola berikut: huruf
'a', lalu karakter apa pun satu kali atau lebih
kali, lalu huruf 'x'.
let res = str.replace(/a.+x/g, '!');
Kita berharap, hasilnya akan disimpan dalam variabel
sebagai string '! zzz x kkk'. Namun,
kenyataannya tidak - yang masuk ke variabel adalah string
'! kkk'.
Masalahnya adalah regex kita mencari semua
karakter dari huruf 'a' hingga huruf 'x'.
Tapi dalam string kita ada dua huruf 'x'! Karena
sifat serakah, regex akan mencari hingga
huruf 'x' yang terakhir, sehingga mengambil
lebih dari yang kita harapkan.
Tentu saja, seringkali perilaku seperti inilah yang kita inginkan. Tapi khusus dalam kasus ini, kita ingin membatalkan keserakahan dan memberi tahu regex untuk mencari hingga huruf 'x' yang pertama.
Untuk membatasi keserakahan, kita perlu menambahkan tanda tanya setelah operator pengulangan:
let res = str.replace(/a.+?x/g, '!');
Keserakahan dapat dibatasi untuk semua operator
pengulangan: baik *, ?, maupun {}
- seperti ini: *?, ?? dan {}?.
Diberikan string:
let str = 'aba accca azzza wwwwa';
Tuliskan regex yang akan menemukan semua string
yang diapit oleh huruf 'a',
dan mengganti setiap string tersebut dengan '!'. Di antara
huruf 'a' boleh ada karakter apa pun (kecuali
'a').