⊗jsSpRELAB 133 of 294 menu

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.

nlkkhicssw