Biz ushlash guruhlarining (...)
mazmunidan nafaqat natijada yoki almashtirish satrida, balki naqshning o’zida ham foydalanishimiz mumkin.
Raqam bo’yicha orqa havola: \N
Guruhga naqshda \N
yordamida havola qilish mumkin, bu yerda N
– guruh raqami.
Buning nega foydali ekanligini aniq qilish uchun vazifani ko’rib chiqaylik.
Biz qo’shtirnoqlangan satrlarni topishimiz kerak: bitta qo’shtirnoq '...'
yoki qo’sh qo’shtirnoq "..."
– ikkala variant ham mos kelishi kerak.
Ularni qanday topish mumkin?
Biz ikkala turdagi qo’shtirnoqlarni kvadrat qavslarga qo’yishimiz mumkin: ['"](.*?)['"]
, lekin bu aralash qo’shtirnoqli satrlarni topadi, masalan "...'
va '..."
. Bu bir qo’shtirnoq boshqasi ichida paydo bo’lganda, masalan "She's the one!"
satrida noto’g’ri mosliklarga olib keladi:
let str = `He said: "She's the one!".`; let regexp = /['"](.*?)['"]/g; // Natija biz xohlagan narsa emas alert( str.match(regexp) ); // "She'
Ko’rib turganingizdek, naqsh ochuvchi qo’shtirnoq "
ni topdi, keyin matn boshqa qo’shtirnoq '
gacha iste’mol qilindi, bu moslikni yopadi.
Naqsh yopuvchi qo’shtirnoqni ochuvchi bilan aynan bir xil qidirishini ta’minlash uchun uni ushlash guruhiga o’rab, orqa havola qilishimiz mumkin: (['"])(.*?)\1
.
Mana to’g’ri kod:
let str = `He said: "She's the one!".`; let regexp = /(['"])(.*?)\1/g; alert( str.match(regexp) ); // "She's the one!"
Endi u ishlaydi! Doimiy ifoda dvigateli birinchi qo’shtirnoq (['"])
ni topadi va uning mazmunini eslab qoladi. Bu birinchi ushlash guruhi.
Naqshda keyin \1
“birinchi guruhdagi bilan bir xil matnni top” degani, bizning holatimizda aynan bir xil qo’shtirnoq.
Xuddi shunday, \2
ikkinchi guruh mazmunini, \3
– 3-guruhni va hokazolarni bildiradi.
Agar biz guruhda ?:
ishlatsak, unga havola qila olmaymiz. Ushlashdan chiqarilgan (?:...)
guruhlar dvigatel tomonidan eslab qolinmaydi.
\1
, almashtirishda: $1
Almashtirish satrida biz dollar belgisini ishlatamiz: $1
, naqshda esa – teskari chiziq \1
.
Nom bo’yicha orqa havola: \k<name>
Agar regexpda ko’plab qavslar bo’lsa, ularga nom berish qulay.
Nomlangan guruhga havola qilish uchun \k<name>
dan foydalanishimiz mumkin.
Quyidagi misolda qo’shtirnoqlar guruhi ?<quote>
deb nomlangan, shuning uchun orqa havola \k<quote>
:
let str = `He said: "She's the one!".`; let regexp = /(?<quote>['"])(.*?)\k<quote>/g; alert( str.match(regexp) ); // "She's the one!"
Izohlar
<code>
yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>
yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)