Menghadkan Ketamakan dalam Ungkapan Biasa di JavaScript
Ungkapan biasa secara lalai adalah greedy (tamak). Ini bermakna ia akan menangkap jumlah aksara maksimum yang mungkin. Mari kita lihat contoh. Katakan kita mempunyai tali seperti berikut:
let str = 'aeeex zzz x kkk';
Katakan kita mahu mencari subrentetan
'aeeex' dalam tali ini menggunakan corak berikut: huruf
'a', kemudian sebarang aksara satu atau lebih
kali, kemudian huruf 'x'.
let res = str.replace(/a.+x/g, '!');
Kami menjangkakan bahawa hasilnya dalam
pembolehubah akan menjadi rentetan '! zzz x kkk'. Walau bagaimanapun,
ianya tidak begitu - pembolehubah mengandungi rentetan
'! kkk'.
Masalahnya ialah ungkapan biasa kami mencari semua
aksara dari huruf 'a' hingga huruf 'x'.
Tetapi dalam rentetan kami terdapat dua huruf 'x'! Disebabkan
sifat tamak, ungkapan biasa akan mencari sehingga
huruf 'x' terakhir, seterusnya menangkap
bukan yang kita jangkakan.
Sudah tentu, selalunya tingkah laku ini adalah yang kita perlukan. Tetapi khusus dalam kes ini, kami ingin membatalkan sifat tamak dan memberitahu ungkapan biasa untuk mencari hingga huruf 'x' pertama.
Untuk menghadkan ketamakan, anda perlu meletakkan tanda tanya selepas operator pengulangan:
let res = str.replace(/a.+?x/g, '!');
Ketamakan boleh dihadkan untuk semua operator
pengulangan: baik *, ?, mahupun {}
- seperti ini: *?, ?? dan {}?.
Diberikan rentetan:
let str = 'aba accca azzza wwwwa';
Tulis ungkapan biasa yang akan mencari semua rentetan
yang diapit oleh huruf 'a',
dan menggantikan setiap satu dengan '!'. Antara
huruf 'a' boleh terdapat sebarang aksara (selain
'a').