Perl bilan mos keladigan doimiy iboralar - Perl Compatible Regular Expressions

Perl bilan mos keladigan doimiy iboralar
Asl muallif (lar)Filipp Hazel
Barqaror chiqish
PCRE 8.44 va PCRE2 10.35 / 2020 yil 9-may; 6 oy oldin (2020-05-09) [1]
Ombor Buni Vikidatada tahrirlash
YozilganC
Operatsion tizimO'zaro faoliyat platforma
TuriNaqshni moslashtirish kutubxona
LitsenziyaBSD
Veb-saytwww.pcre.org

Perl bilan mos keladigan doimiy iboralar (PCRE) a kutubxona yozilgan C, amalga oshiradigan a doimiy ifoda imkoniyatlaridan ilhomlangan dvigatel Perl dasturlash tili. Filipp Hazel 1997 yil yozida PCRE yozishni boshladi [2]. PCRE sintaksisining ikkalasiga qaraganda ancha kuchli va moslashuvchan POSIX doimiy ifodasi lazzatlar (BRE, ERE) [3] va boshqa ko'plab doimiy ekspression kutubxonalarga qaraganda.

Dastlab PCRE Perl bilan xususiyat-ekvivalentlikka qaratilgan bo'lsa-da, ikkita dastur to'liq ekvivalent emas. PCRE 7.x va Perl 5.9.x bosqichida ikkita loyiha rivojlanishni muvofiqlashtirdi, ularning xususiyatlari ikkala yo'nalishda ham o'zaro bog'langan. [4]

2015 yilda qayta ishlangan dasturlash interfeysi (API) bilan PCRE vilkasi chiqarildi. PCRE1 (8.xx seriyali) deb nomlangan dastlabki dasturiy ta'minotda xatolar tuzatildi, ammo keyingi rivojlanish yo'q. Hozir (2020) eskirgan deb hisoblanadi va hozirgi 8.44 versiyasi so'nggi bo'lishi mumkin. Yangi PCRE2 kodi (10.xx seriyali) bir qator kengaytmalarni va kodlashni takomillashtirdi va bu erda rivojlanish amalga oshiriladi.

Bir qator taniqli ochiq manbali dasturlar kabi Apache va Nginx HTTP serverlari va PHP va R stsenariy tillari, PCRE kutubxonasini o'z ichiga oladi; xususiy dasturiy ta'minot ham shunday qilishi mumkin, chunki kutubxona BSD litsenziyasiga ega. Perl 5.10-dan boshlab, PCRE, Perl-ning odatiy ekspres motorini almashtirish vositasi sifatida ham mavjud re :: engine :: PCRE modul.

Kutubxona Unix, Windows va boshqa bir qator muhitlarda qurilishi mumkin. PCRE2 POSIX C plyonkasi bilan tarqatiladi [Izoh 1], bir nechta sinov dasturlari va kutubxona bilan birgalikda o'rnatilgan "pcre2grep" yordam dasturi.



Xususiyatlari

Ayni paytda kompilyator qo'llab-quvvatlash

Ushbu ixtiyoriy xususiyat, agar PCRE2 kutubxonasi yaratilganda yoqilgan bo'lsa, foydalanish mumkin. Qo'ng'iroq qilish dasturi ushbu funktsiyani takroriy ravishda bajariladigan mos keladigan naqshlardan foydalanganda katta ishlash afzalliklari mumkin. Ayni paytda kompilyatorni qo'llab-quvvatlash Zoltan Herczeg tomonidan yozilgan va POSIX paketida ko'rsatilmagan.


Moslashuvchan xotirani boshqarish

PCRE1-da backtracking uchun tizim to'plamidan foydalanish muammoli bo'lishi mumkin, shuning uchun PCRE2-da dasturning ushbu xususiyati o'zgartirilgan. Endi bu maqsad uchun uyum ishlatiladi va uning umumiy miqdori cheklanishi mumkin. Muammo stack overflow PCRE1 bilan muntazam ravishda ishlab chiqarilgan, endi 10.30 (2017) versiyasidan boshlab PCRE2 bilan bog'liq muammo bo'lmaydi.


Izchil qochish qoidalari

Perl singari, PCRE2 ham qochishning doimiy qoidalariga ega: alfa-raqamli bo'lmagan har qanday belgi uning oldiga \ Belgidan oldin (orqa chiziq). Oldinga teskari chiziq qo'yilgan har qanday alfa-raqamli belgi odatda unga alohida ma'no beradi. Agar ketma-ketlik maxsus deb belgilanmagan bo'lsa, xato yuzaga keladi. Bu Perldan farq qiladi, bu faqat ogohlantirish rejimida bo'lsa (PCRE2 ogohlantirish rejimiga ega bo'lmasa) xatoga yo'l qo'yadi. POSIX-ning doimiy ifodalarida, ba'zida teskari alfa-raqamlardan qutulish mumkin (masalan, \.), ba'zan esa ular maxsus xususiyatni kiritdilar (masalan, \(\)).


Kengaytirilgan belgilar sinflari

Bitta harfli belgilar sinflari uzunroq POSIX nomlariga qo'shimcha ravishda qo'llab-quvvatlanadi. Masalan, d har qanday raqamga to'liq mos keladi [[: raqam:]] POSIX-ning doimiy ifodalarida.


Minimal moslik ("nogreedy")

A ? eng qisqa gugurtdan foydalanish kerakligini bildiruvchi har qanday takrorlash miqdoridan keyin joylashtirilishi mumkin. Odatiy bo'lib, eng uzun o'yin birinchi va qisqa o'yinlar orqali orqaga qaytish: masalan. a. *? b "ababab" da "ab" ga mos keladi, qaerda a. * b butun mag'lubiyatga mos keladi.


Unicode belgilar xususiyatlari

Unicode har bir belgi uchun bir nechta xususiyatlarni belgilaydi. PCRE2-dagi naqshlar ushbu xususiyatlarga mos kelishi mumkin: masalan. \p{Ps}.*?\p{Pe} har qanday "ochilish punktuatsiyasi" bilan boshlanadigan va har qanday "yaqin punktuatsiya" bilan tugaydigan qatorga mos keladi [abc]. PCRE2_UCP kompilyatsiya opsiyasi o'rnatilganda, ma'lum bir "normal" metakarjlarning mos kelishini Unicode xususiyatlari boshqarishi mumkin. Variantni qo'shib naqsh uchun o'rnatilishi mumkin (* UCP) naqsh boshida. Variant quyidagi metaxarakterlarning ishlashini o'zgartiradi: B, b, D., d, S, s, V, w, va ba'zi POSIX belgilar sinflari. Masalan, mos keladigan belgilar to'plami w (so'z belgilar) Unicode xususiyatlari bilan belgilanadigan harflar va ta'kidlangan harflarni o'z ichiga olgan holda kengaytirilgan. Bunday moslik odatdagidan sekinroq (ASCII - faqat) UCP bo'lmagan alternativ. Shuni esda tutingki, UCP opsiyasi kutubxonani Unicode-ni qo'llab-quvvatlashi uchun tuzilgan bo'lishi kerak (bu PCRE2 uchun standart). PCRE1 ning juda erta versiyalari faqat ASCII kodini qo'llab-quvvatladi. Keyinchalik UTF-8 yordami qo'shildi. UTF-16-ni qo'llab-quvvatlash 8.30 versiyasida va UTF-32-ni 8.32 versiyasida qo'llab-quvvatlandi. PCRE2 har doim ham uchta UTF kodlashni qo'llab-quvvatladi.


Ko'p qatorli moslik

^ va $ faqat qatorning boshida va oxirida yoki qaysi qatorlar qo'yilganiga qarab satr ichidagi har bir "chiziq" ning boshida va oxirida mos kelishi mumkin.


Newline / linebreak variantlari

PCRE kompilyatsiya qilinganida yangi satr sukut tanlanadi. Qaysi yangi yo'nalish / chiziq buzilishi PCRE aniqlagan joyga ta'sir qiladi ^ qator boshlari va $ tugaydi (ko'p qatorli rejimda), shuningdek nuqta bilan mos keladigan narsa (ko'p qatorli rejimdan qat'i nazar, agar dotall variantidan tashqari) (? lar) o'rnatilgan). Bu shuningdek PCRE-ni moslashtirish protsedurasiga ta'sir qiladi (7.0-versiyadan boshlab): yangi satr ketma-ketligi boshlanishida mos kelmagan naqsh mos kelmasa, PCRE o'yinni qayta urinishdan oldin barcha yangi qatorlar qatoridan o'tib ketadi. Agar amalda yangi satr variantining alternativasi CRLF-ni amaldagi qatorlardan biri sifatida qo'shsa, u o'tkazib yubormaydi n Agar naqsh o'ziga xos xususiyatga ega bo'lsa, CRLF-da r yoki n ma'lumotnomalar (7.3 versiyadan beri). 8.10 versiyasidan beri metakarakter N har doim chiziq belgilaridan tashqari har qanday belgiga mos keladi. U xuddi shunday xatti-harakatga ega . qachon dotall variant aka (? lar) amalda emas.


Yangi qator variantini naqsh tuzilganda va u ishga tushirilganda tashqi parametrlar bilan o'zgartirish mumkin. PCRE-dan foydalangan holda bir nechta dastur foydalanuvchilarga ushbu parametrni tashqi parametr orqali qo'llash vositalarini taqdim etadi. Shunday qilib, yangi satr variantini naqshning boshida quyidagilardan birini ishlatib aytish mumkin:

  • (* LF) Newline - bu chiziqli ovqatlanish belgisi.

    Tegishli chiziqli uzilishlar bilan mos kelish mumkin n.
  • (* CR) Newline - bu vagonni qaytarish.

    Tegishli chiziqli uzilishlar bilan mos kelish mumkin r.
  • (* CRLF) Newline / linebreak - bu transport vositalarining qaytishi va undan keyin chiziqli uzatish.

    Tegishli chiziqli uzilishlar bilan mos kelish mumkin r n.
  • (* ANYCRLF) Ma'lumotlarda uchragan yuqoridagi har qanday narsa yangi qatorni qayta ishlashga olib keladi.

    Tegishli chiziqli uzilishlar bilan mos kelish mumkin (?:\r\n?|\n) yoki bilan R.

    Backslash-R mos keladigan narsalarga tegishli konfiguratsiya va variantlarni quyida ko'rib chiqing.

  • (* Har qanday) Yuqoridagi har qanday qo'shimcha va maxsus Unicode qatoridagi buzilishlar.

    UTF-8 rejimida bo'lmaganida, mos keladigan satrlarni moslashtirish mumkin (?:\r\n?|\n|\x0B|\f|\x85) [Izoh 2] yoki R.

    UTF-8 rejimida ikkita qo'shimcha belgi chiziqli tanaffus sifatida tan olinadi (* Har qanday):

    • LS (chiziq ajratuvchi, U + 2028),
    • PS (xat ajratuvchi, U + 2029).

    Windows-da, Unicode bo'lmagan ma'lumotlarda, ba'zilari HAMMA linebreak belgilar boshqa ma'nolarga ega.

    Masalan, x85 gorizontal ellipsisga mos kelishi mumkin va agar u duch kelsa HAMMA newline amalda, bu yangi qatorni qayta ishlashga olib keladi.

    Backslash-R mos keladigan narsalarga tegishli konfiguratsiya va variantlarni quyida ko'rib chiqing.


Backslash-R parametrlari

PCRE kompilyatsiya qilinganida, mos keladigan narsa uchun sukut tanlanadi R. Odatiy bo'lib, ANYCRLF-ga mos keladigan yoki ANYCRLF-ga mos keladigan satrlarni mos keladigan bo'lishi mumkin. Agar kerak bo'lsa, sukut bo'yicha bekor qilinishi mumkin (* BSR_UNICODE) yoki (* BSR_ANYCRLF) naqsh boshida. Qachon ta'minlash (* BSR ..) variant, shuningdek, a ni taqdim etishingiz mumkin (*yangi qator) variant, masalan, (* BSR_UNICODE) (* har qanday)dam olish uslubi. Backslash-R parametrlarini, shuningdek, naqsh tuzilganda, PCRE2 deb nomlangan dastur yordamida tashqi parametrlar bilan o'zgartirish mumkin.


Naqshli variantlarning boshlanishi

Kabi linebreak variantlari (* LF) yuqorida hujjatlashtirilgan; kabi teskari chiziq-R variantlari (* BSR_ANYCRLF) yuqorida hujjatlashtirilgan; Unicode belgilar xususiyatlari parametrlari (* UCP) yuqorida hujjatlashtirilgan; (* UTF8) variant quyidagicha hujjatlashtirilgan: agar sizning PCRE2 kutubxonangiz to'plangan bo'lsa UTF qo'llab-quvvatlash, siz belgilashingiz mumkin (* UTF) UTF-8, UTF-16 yoki UTF-32 rejimini ishga tushirish uchun tashqi variantni o'rnatish o'rniga naqsh boshidagi parametr.


Orqaga havolalar

Naqsh oldingi o'yin natijalariga murojaat qilishi mumkin. Masalan, (a | b) c 1 yoki "aca" yoki "bcb" ga mos keladi va mos kelmaydi, masalan "acb".


Nomlangan pastki naqshlar

Pastki naqsh (o'xshash qavslar bilan o'ralgan (...)) etakchini qo'shish bilan nomlanishi mumkin ? P ochilish parantezidan keyin. Nomlangan pastki naqshlar PCRE tomonidan qabul qilingan xususiyatdir Python doimiy iboralar.

Keyinchalik bu xususiyat Perl tomonidan qabul qilindi, shuning uchun endi nomlangan guruhlar yordamida ham aniqlanishi mumkin (? ...) yoki (? 'ism' ...), shu qatorda; shu bilan birga (? P ...). Nomlangan guruhlarga qayta murojaat qilish mumkin, masalan: (? P = ism) (Python sintaksisi) yoki k'name ' (Perl sintaksis).


Subroutines

Orqaga yo'naltirish sub'ektning ilgari pastki naqshga mos keladigan qismiga murojaat qilish mexanizmini taqdim etsa, pastki dastur oldindan aniqlangan pastki naqshni qayta ishlatish mexanizmini taqdim etadi. Subpatternning imkoniyatlari, masalan, mustaqil holat, subpattern aniqlanganda aniqlanadi. (a.c) (? 1) "aacabc" yoki "abcadc" ga mos keladi, aksincha, orqaga yo'naltirish yordamida (a.c) 1 bo'lmaydi, lekin ikkalasi ham "aacaac" yoki "abcabc" ga mos keladi. PCRE shuningdek, Perl bo'lmagan dasturni ham qo'llab-quvvatlaydi Oniguruma pastki dasturlar uchun qurish. Ular yordamida aniqlanadi g yoki g .


Atom guruhlari

Atom guruhlari - bu oldini olish usulidir orqaga qaytish naqsh bilan. Masalan, a ++ mil iloji boricha ko'proq "a" larga mos keladi va ulardan birini sinash uchun hech qachon zaxira nusxasini yaratmaydi.


Oldinga va orqaga qarashga oid tasdiqlar

TasdiqlashOrqaga qarabQarang
Ijobiy(?<=naqsh)(?=naqsh)
Salbiy(?<!naqsh)(?!naqsh)
Orqaga qarash va oldinga qarab tasdiqlash
yilda Perl doimiy iboralar

Naqshlar oldingi matnda yoki keyingi matnda mos keladigan matnni sarf qilmasdan naqsh mavjudligini tasdiqlashi mumkin (nol kenglikdagi tasdiq). Masalan, / w + (? = t)/ so'zga mos keladi, so'ngra a yorliq, yorliqning o'zi qo'shilmasdan.

Orqaga qarashli da'volar noaniq uzunlikda bo'lishi mumkin emas, ammo (Perldan farqli o'laroq) har bir novda har xil sobit uzunlikda bo'lishi mumkin.

K o'yinning boshlanishini tiklash uchun naqsh sifatida ishlatilishi mumkin. Bu orqaga qarashli da'volarga moslashuvchan muqobil yondashuvni taqdim etadi, chunki o'yinning bekor qilingan qismi (oldingi qism) K) uzunlikka o'rnatilishi shart emas.


Nol kenglikdagi tasdiqlash uchun ketma-ketliklardan qochish

Masalan, b ga o'xshash nol kenglikdagi "so'z chegaralarini" moslashtirish uchun (?<=\V)(?=\w)|(?<=\w)(?=\V)|^|$.


Izohlar

Sharh bilan boshlanadi (?# va keyingi yopiladigan qavsda tugaydi.


Rekursiv naqshlar

Naqsh o'z-o'zidan yoki har qanday pastki naqshga murojaat qilishi mumkin. Masalan, naqsh \((a*|(?R))*\) muvozanatli qavslar va "a" lar kombinatsiyasiga mos keladi.


Umumiy so'zlar

PCRE iboralari joylashtirilishi mumkin (? C''n ''), qayerda n bu raqam. Bu PCRE API orqali tashqi foydalanuvchi tomonidan aniqlangan funktsiyani chaqiradi va o'zboshimchalik bilan kodni naqshga joylashtirish uchun ishlatilishi mumkin.



Perldan farqlar

PCRE2 va Perl o'rtasidagi farqlar (Perl 5.9.4 dan boshlab) quyidagilarni o'z ichiga oladi, lekin ular bilan chegaralanmaydi. [5]

  • 10.30-ga qadar rekursiv o'yinlar PCRE-da atomik, Perl-da atomik bo'lmagan:

    Bu shuni anglatardi "<<!>!>!>><>>!>!>!>" =~ /^(<(?:[^<>]+|(?3)|(?1))*>)()(!>!>!>)$/ 10.30-ga qadar Perlda, ammo PCRE2-da emas.


  • Dan olingan tortishish buferining qiymati ? boshqa miqdoriy ta'qib qilish tamponiga joylashtirilganida miqdoriy ko'rsatkich (1 yoki 0 marta mos keladi) boshqacha:

    Perlda "aba" =~ / ^ (a (b)?) + $ /; olib keladi $1 tarkibida "a" va $2 o'z ichiga olgan undef, lekin PCRE-ga olib keladi $2 tarkibida "b" mavjud.


  • PCRE nomlangan ta'qib qilish buferlariga raqamli nomlar berishga imkon beradi; Perl so'zi barewords qoidalariga rioya qilish uchun talab qiladi:

    Bu shuni anglatadiki g {} Perl-da aniq, ammo PCRE-da noaniq.

    Bu endi PCRE 8.34 (2013-12-15 yillarda chiqarilgan) dan beri farq qilmaydi, bu endi guruh nomlarini raqam bilan boshlashga imkon bermaydi. [6]


  • PCRE tashqi ko'rinishdagi alternativalarni har xil uzunlikda bo'lishiga imkon beradi:

    Shunga qaramay, PCRE ham, Perl ham qat'iy uzunlikdagi naqshlarni talab qiladi.

    Ya'ni, PCRE ham, Perl ham o'zgaruvchan uzunlikdagi naqshlarga ruxsat bermaydilar.


    Biroq, Perl qarashning orqa tomonidagi tasdiqlashning barcha muqobil tarmoqlarini bir-birlari bilan bir xil uzunlikda bo'lishini talab qiladi, PCRE esa har bir novda aniq uzunlikka ega bo'lgan ekan, bu muqobil tarmoqlarning bir-biridan turli uzunliklarga ega bo'lishiga imkon beradi.


  • PCRE ma'lum "eksperimental" Perl konstruktsiyalarini qo'llab-quvvatlamaydi:

    Kabi (??{...}) (qaytishi naqshning bir qismi sifatida baholanadigan qayta qo'ng'iroq) yoki (?{}) qurish, garchi ikkinchisi yordamida taqlid qilinishi mumkin (? Cn).

    Perl 5.9.x qatoriga qo'shilgan rekursiyani boshqarish fe'llari ham qo'llab-quvvatlanmaydi.


    Eksperimental orqaga chekinishni boshqarish fe'llarini qo'llab-quvvatlash (Perl 5.10 da qo'shilgan) PCRE-da 7.3 versiyasidan beri mavjud.

    Ular (* YO'Q), (* F), (*QORA OLXO'RI), (* O'tkazib yuborish), (* UNDA), (* QO'ShIMChA)va (* QABUL QILING).


    Perlning orqaga qaytish boshqaruv fe'llari bilan argumentlarni mos ravishda ishlatishi umuman qo'llab-quvvatlanmaydi.

    Shunga qaramay, 8.10 versiyasidan boshlab PCRE quyidagi fe'llarni ko'rsatilgan argument bilan qo'llab-quvvatlaydi: (* MARK: markName), (* SKIP: markName), (* PRUNE: markName)va (* O'shanda: markName).


    10.32 versiyasidan beri PCRE2 qo'llab-quvvatlaydi (* QABUL QILING: markName), (* FAIL: markName)va (* KOMITSIYA: markName).


  • PCRE va Perl xato tuzilmalarga bardoshliligi bilan bir oz farq qiladi:

    Perl-da kvalifikatorlarga ruxsat beriladi (?!...) ma'nosiz, ammo zararsiz (samarasiz bo'lsa ham) qurish; PCRE 8.13 dan oldingi versiyalarida xatolikka yo'l qo'ydi.


  • PCRE-da rekursiya chuqurligi juda qiyin, ammo Perl yo'q:

    Standart o'rnatish parametrlari bilan "bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" =~ /.X(.+)+X/ limit tufayli mos kelmaydi, ammo Perl bunga to'g'ri mos keladi.

    Perl rekursiya uchun yig'indidan foydalanadi va rekursiya chuqurligi uchun qattiq chegaraga ega emas, PCRE2 da esa chaqiruvchi ilova yordamida yuqoriga yoki pastga sozlanishi mumkin bo'lgan kompilyatsiya vaqtining standart chegarasi mavjud.


Yuqoridagi fikrlar bundan mustasno, PCRE Perl-dagi sinovlardan muvaffaqiyatli o'tishi mumkin "t / op / re_tests"fayl, Perlning doimiy ekspression dvigatelining sintaksis darajasidagi asosiy regressiya sinovlaridan biri.



Izohlar va ma'lumotnomalar

Izohlar

  1. ^ PCRE2 asosiy kutubxonasi mos keladigan va mos keladigan va almashtiriladigan funksiyalarni taqdim etadi.
  2. ^ Albatta \x85 qismi emas \xC2\x85? (ya'ni (?:\r\n?|\n|\x0B|\f|\xC2\x85), kabi U + 0085 ! = 0x85)

    Ogohlantirish: Agar naqsh \xC2\x85 ishlamadi: RegEx dasturining Unicode sozlamalari bilan tajriba qiling yoki quyidagilar bilan almashtiring:
    • \x{0085}
    • \u0085


Adabiyotlar

  1. ^
  2. ^
    • Exim va PCRE: qanday qilib bepul dastur mening hayotimni o'g'irlab ketdi (1999-12), tomonidan Filipp Hazel: https://www.ukuug.org/events/winter99/proc/PH.ps

      PCRE haqida nima deyish mumkin?

      • Ftp saytida joylashtirilgan 1997 yil yozida yozilgan.
      • Odamlar buni topdilar va pochta ro'yxatini boshladilar.
      • Yaxshilash ishlari olib borildi.
        - Exim va PCRE: Qanchalik bepul dastur mening hayotimni o'g'irlab ketdi, Pg. 7
  3. ^
  4. ^
  5. ^
  6. ^
  7. ^



Shuningdek qarang


Tashqi havolalar

Kembrijning hisoblash xizmati universiteti (CSX )