Muntazam ifodalar (RegExp)

Lookahead va lookbehind

Ba'zan biror belgini faqat undan oldin yoki keyin ma'lum narsa bo'lsa tutmoqchi bo'lamiz โ€” lekin o'sha "kontekst"ni natijaga qo'shmaymiz. Aynan shuning uchun lookahead (oldinga qarash) va lookbehind (orqaga qarash) mavjud. Ular "nol kenglikdagi" tekshiruvlar: shartni tekshiradi, lekin matnni "yeb qo'ymaydi".

Ijobiy lookahead: x(?=y)

x(?=y) โ€” x ni faqat undan keyin y kelsa tutadi. Muhimi: y natijaga kirmaydi, u faqat shart sifatida tekshiriladi.

Masalan, sonni faqat undan keyin "so'm" so'zi kelsa tutamiz:

lookahead-ijobiy.js
// natija shu yerda chiqadi

Natijada faqat raqamlar bor โ€” " so'm" qismi tutilmadi, u shunchaki shart bo'ldi. Agar oddiy \d+ so'm yozganimizda, natijada "so'm" ham bo'lardi.

Salbiy lookahead: x(?!y)

x(?!y) โ€” x ni faqat undan keyin y KELMASA tutadi. Bu ijobiy lookaheadning aksi.

Endi "so'm" kelmagan raqamlarni tutamiz (masalan, o'lchov birligisiz sonlar):

lookahead-salbiy.js
// natija shu yerda chiqadi
Yuqorida \b (so'z chegarasi) qo'shildi, aks holda 100 dan 10 qismi tutilib qolardi (chunki 10 dan keyin "0 so'm" keladi, ya'ni " so'm" emas). \b sonni to'liq oxiriga bog'laydi.

Ijobiy lookbehind: (?<=y)x

(?<=y)x โ€” x ni faqat undan oldin y kelsa tutadi. Bu lookaheadning "orqaga qaragan" varianti. y yana natijaga kirmaydi.

Masalan, dollar belgisidan keyingi summani tutamiz โ€” $ ni o'zini olmasdan:

lookbehind-ijobiy.js
// natija shu yerda chiqadi

Bu yerda \$ eskeyplangan (dollar RegExp'da "satr oxiri" ma'nosini beradi), va u lookbehind ichida shart bo'lgani uchun natijaga 30 va 100 tushdi, $ esa tushmadi.

Salbiy lookbehind: (?

(?<!y)x โ€” x ni faqat undan oldin y KELMASA tutadi. Masalan, dollar belgisi bilan bog'lanmagan sonlarni ajratamiz:

lookbehind-salbiy.js
// natija shu yerda chiqadi
To'rt turni eslab qolish: ?= va ?! โ€” oldinga (keyin nima keladi); ?<= va ?<! โ€” orqaga (oldin nima kelgan). Undov ! โ€” inkor, teng = โ€” tasdiq.

Amaliy misol: narxni formatlash

Kuchli misol โ€” katta sonlarga uch xonadan ajratuvchi bo'sh joy qo'yish (1234567 -> 1 234 567). Buni lookahead bilan qilish mumkin: har bir raqam oldiga bo'sh joy qo'yamiz, agar undan keyin uchtalik guruhlar qolgan bo'lsa:

narx-format.js
// natija shu yerda chiqadi

Bu qanday ishlaydi? \d(?=(\d{3})+$) โ€” shunday raqamni tanlaydiki, undan keyin to'liq uchtalik guruhlar (bir yoki ko'p) va satr oxiri kelsin. Bunday raqamdan keyin bo'sh joy o'rinli. $& โ€” topilgan raqamning o'zi.

narx-funksiya.js
// natija shu yerda chiqadi

Lookahead ichida guruhlar

Lookahead va lookbehind ichida to'liq ifodalar, jumladan guruhlar va alternatsiya bo'lishi mumkin. Masalan, parol tekshiruvida bir necha shartni birdan qo'yish:

lookahead-parol.js
// natija shu yerda chiqadi

Bu yerda ikkita lookahead ketma-ket ishlatilgan. Ular "nol kenglik" bo'lgani uchun ikkalasi ham satr boshidan tekshiradi va bir-biriga xalal bermaydi โ€” bu birdan bir necha shartni qo'yishning klassik usuli.

Qachon kerak?

Lookahead/lookbehind quyidagi holatlarda juda foydali:

Zamonaviy JavaScript dvigatellari (Node.js, brauzerlar) lookbehind'ni to'liq qo'llab-quvvatlaydi. Ilgari u faqat lookahead uchun mavjud edi, endi ikkalasi ham ishlatilaveradi.
Lookahead/lookbehind joy egallamaydi โ€” ular kursorni oldinga su[u]rmaydi. Shuning uchun natijada faqat asosiy x qismi bo'ladi, shart qismidagi belgilar keyingi mos kelishlarda qayta ishlatilishi mumkin.

Xulosa