Positif dan Negatif Lookahead dalam Regex JavaScript
Kadang-kadang kita perlu menyelesaikan masalah seperti ini: cari
rentetan 'aaa' dan gantikannya dengan '!',
tetapi hanya jika selepas 'aaa' terdapat
'x', dan 'x' itu sendiri
tidak diganti. Jika kita cuba menyelesaikan masalah ini
'secara langsung', kita tidak akan berjaya:
'aaax baaa'.replace(/aaax/g, '!'); // mengembalikan '! baaa', tetapi kita mahu '!x baaa'
Lookahead
Untuk menyelesaikan masalah ini, kita perlukan cara untuk menyatakan
bahawa 'x' tidak patut diganti. Ini dilakukan
dengan menggunakan kurungan khas (?= ),
yang hanya melihat, tetapi tidak mengambilnya.
Kurungan ini dipanggil positif lookahead
. Positif - kerana 'x'
(dalam kes kita) mesti hadir - hanya then
penukaran akan berlaku.
Mari gunakan kurungan ini untuk menyelesaikan masalah kita:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // mengembalikan '!x aaab'
Terdapat juga negatif lookahead
- (?! ) - ia, sebaliknya, menyatakan bahawa
sesuatu tidak patut hadir. Dalam contoh berikut,
penukaran akan berlaku, hanya jika selepas 'aaa'
bukan 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // mengembalikan 'aaax !b'
Lookbehind
Secara analogi, terdapat positif lookbehind
- (?<= ). Dalam
contoh berikut, penukaran akan berlaku, hanya jika sebelum
'aaa' terdapat 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // mengembalikan 'x!'
Dan terdapat juga negatif lookbehind
- (?<! ). Dalam contoh berikut, penukaran
akan berlaku, hanya jika sebelum 'aaa'
tidak terdapat 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // mengembalikan 'b!'
Masalah Praktikal
Diberi rentetan yang mengandungi nama fungsi:
let str = 'func1() func2() func3()';
Dapatkan array nama fungsi dari rentetan tersebut.
Diberi rentetan dengan tag:
let str = '<a href="" class="eee" id="zzz">';
Dapatkan array nama atribut untuk tag ini.
Diberi rentetan dengan pembolehubah:
let str = '$aaa $bbb $ccc xxxx';
Dapatkan subrentetan yang didahului oleh tanda dolar.