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:
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):
\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:
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:
?= 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:
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.
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:
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:
- Biror belgini kontekst asosida tutish, lekin kontekstni natijaga qo'shmaslik (masalan, valyutadan oldingi/keyingi son);
replaceda faqat kerakli qismni almashtirish, atrofdagilarga tegmasdan;- Bir necha shartni birdan tekshirish (parol murakkabligi kabi);
- "Bunday emas" mantig'i โ masalan, ma'lum so'zdan keyin/oldin kelmagan holatlarni topish.
x qismi bo'ladi, shart qismidagi belgilar keyingi mos kelishlarda qayta ishlatilishi mumkin.Xulosa
x(?=y)โ ijobiy lookahead: keyinybo'lsa,xni tut;x(?!y)โ salbiy lookahead: keyinyBO'LMASA,xni tut;(?<=y)xโ ijobiy lookbehind: oldinybo'lsa,xni tut;(?<!y)xโ salbiy lookbehind: oldinyBO'LMASA,xni tut;- Shart qismi (
y) natijaga kirmaydi โ bu "nol kenglikli" tekshiruv; - Qo'llanilishi: kontekstga bog'liq tutish, narxni formatlash, parol tekshiruvi, aniq almashtirish.