Muntazam ifoda - Regular expression

Namunaning natijalari
(?<=.){2,}(?=[A-Z])
Kamida ikkita bo'shliq mos keladi, lekin ular to'g'ridan-to'g'ri nuqta (.) Keyin va katta harfdan oldin sodir bo'lganda.
Stiven Koul Klayn, kim kontseptsiyani ixtiro qilishga yordam berdi
Qora ro'yxat kuni Vikipediya yomon nomlarni aniqlash uchun doimiy iboralardan foydalanadi

A doimiy ifoda (qisqartirilgan regex yoki regexp;[1] deb ham ataladi ratsional ifoda[2][3]) ning ketma-ketligi belgilar a ni belgilaydigan qidirmoq naqsh. Odatda bunday naqshlar tomonidan ishlatiladi qatorlarni qidirish algoritmlari "topish" yoki "topish va almashtirish" operatsiyalari uchun torlar yoki kirishni tekshirish uchun. Bu ishlab chiqilgan texnikadir nazariy informatika va rasmiy til nazariya.

Kontseptsiya 1950-yillarda Amerika matematikasi paydo bo'lganida paydo bo'ldi Stiven Koul Klayn a tavsifini rasmiylashtirdi oddiy til. Ushbu kontseptsiya umumiy foydalanishga kirishdi Unix matnni qayta ishlash dasturlari. Turli xil sintaksislar doimiy iboralarni yozish uchun 1980-yillardan beri mavjud bo'lib, ulardan biri POSIX standart va boshqasi, keng qo'llaniladigan, bo'lish Perl sintaksis.

Da doimiy iboralar ishlatiladi qidiruv tizimlari, ning dialog oynalarini qidirish va almashtirish matn protsessorlari va matn muharrirlari, yilda matnni qayta ishlash kabi kommunal xizmatlar sed va AWK va leksik tahlil. Ko'pchilik dasturlash tillari o'rnatilgan yoki orqali regex imkoniyatlarini taqdim etish kutubxonalar.

Naqshlar

Bu ibora doimiy iboralardeb nomlangan regexes, ko'pincha quyida tasvirlangan matematik yozuvlardan farqli o'laroq, mos keladigan matritsalarni namoyish qilish uchun o'ziga xos, standart matn sintaksisini anglatishda ishlatiladi. Doimiy ifodadagi har bir belgi (ya'ni uning naqshini tavsiflovchi satrdagi har bir belgi) yoki metakarakter, maxsus ma'noga ega yoki to'g'ridan-to'g'ri ma'noga ega bo'lgan muntazam belgi. Masalan, regexda a., a "a", while "ga to'g'ri keladigan so'zma-so'z belgi." yangi satrdan tashqari har bir belgiga mos keladigan metakarakter. Shuning uchun, bu regex, masalan, 'a', yoki 'ax' yoki 'a0' bilan mos keladi. Birgalikda metakarajlar va harfiy belgilar yordamida berilgan naqsh matnini aniqlashda yoki uning bir qator nusxalarini qayta ishlashda foydalanish mumkin. Naqshli o'yinlar metakarterlar tomonidan boshqariladigan aniq tenglikdan umumiy o'xshashlikka qadar farq qilishi mumkin. Masalan, . bu juda umumiy naqsh, [a-z] ("a" dan "z" gacha bo'lgan barcha kichik harflarga mos keladigan) kamroq umumiy va a aniq naqsh (faqat "a" ga mos keladi). Metakarakter sintaksis turli xil kirish ma'lumotlarini matnni qayta ishlashni avtomatlashtirishga yo'naltirilgan maqsadlarni ixcham va moslashuvchan tarzda ifodalash uchun maxsus ishlab chiqilgan bo'lib, standart yordamida yozish oson. ASCII klaviatura.

Ushbu sintaksisdagi oddiy iboraning juda oddiy holati: a-da yozilgan so'zni topish matn muharriri, doimiy ifoda seriali [sz] e ikkala "serialise" va "serialize" ga mos keladi. Joker belgilar Bundan tashqari, bunga erishishadi, lekin ular naqsh qila oladigan narsalar bilan cheklangan, chunki ular kamroq metakarakterlar va oddiy til bazasiga ega.

Joker belgilarning odatiy konteksti mavjud globbing fayllar ro'yxatidagi o'xshash nomlar, regexlar odatda matn satrlarini naqsh bilan mos keladigan dasturlarda qo'llaniladi. Masalan, regex ^[ ]+|[ ]+$ satr boshida yoki oxirida ortiqcha bo'sh joyga mos keladi. Har qanday raqamga mos keladigan rivojlangan odatiy ibora [+-]?(d+(.d+)?|.d+)([eE] [+ -]?d+)?.

Tarjima qilinmoqda The Kleene yulduzi
(s* "nol yoki undan ko'p" degan ma'noni anglatadi s")

A regex protsessori yuqoridagi sintaksisdagi doimiy ifodani a ga bajarilishi va mos kelishi mumkin bo'lgan ichki ko'rinishga aylantiradi mag'lubiyat qidirilayotgan matnni ifodalaydi. Yagona usul bu Tompsonning qurilish algoritmi qurish a nondeterministik cheklangan avtomat (NFA), bu keyin aniqlangan va natijada aniqlangan cheklangan avtomat (DFA) maqsadli matn satrida oddiy ifodaga mos keladigan pastki satrlarni aniqlash uchun ishlaydi. Rasmda NFA sxemasi ko'rsatilgan N(s*) doimiy ifodadan olingan s*, qayerda s o'z navbatida allaqachon bo'lgan oddiyroq oddiy ifodani bildiradi rekursiv NFAga tarjima qilingan N(s).

Tarix

Muntazam iboralar 1951 yilda, matematik bo'lganida paydo bo'lgan Stiven Koul Klayn tasvirlangan oddiy tillar deb nomlangan uning matematik yozuvidan foydalangan holda muntazam tadbirlar.[4][5] Bular paydo bo'ldi nazariy informatika, ning pastki maydonlarida avtomatlar nazariyasi (hisoblash modellari) va tavsifi va tasnifi rasmiy tillar. Ning boshqa erta tatbiq etilishi naqshlarni moslashtirish o'z ichiga oladi SNOBOL oddiy iboralarni ishlatmagan, aksincha o'ziga xos naqshga mos keladigan konstruktsiyalar.

Muntazam iboralar 1968 yildan mashhur foydalanishga ikki xil usulda kirdi: matn muharririda naqshlarni moslashtirish[6] va kompilyatorda leksik tahlil.[7] Dastur shaklida doimiy iboralarning birinchi paydo bo'lishi orasida qachon bo'lgan Ken Tompson muharrirga Kleenning yozuvlarini o'rnatdi QED naqshlarni moslashtirish vositasi sifatida matnli fayllar.[6][8][9][10] Tezlik uchun Tompson tomonidan muntazam ifodalarni moslashtirish amalga oshirildi o'z vaqtida kompilyatsiya (JIT) ga IBM 7094 kodi Vaqtni taqsimlashning mos keladigan tizimi, JIT kompilyatsiyasining muhim namunasi.[11] Keyinchalik u ushbu imkoniyatni Unix muharririga qo'shdi tahrir, bu oxir-oqibat mashhur qidiruv vositasiga olib keldi grep Oddiy iboralardan foydalanish ("grep" - tahrirlovchida doimiy ifodalarni izlash buyrug'idan olingan so'z: g /qayta/ p "Muntazam ifoda va bosma nashrga mos keladigan satrlarni global qidirish" ma'nosini anglatadi.[12] Tompson QEDni ishlab chiqqan bir vaqtning o'zida bir guruh tadqiqotchilar, shu jumladan Duglas T. Ross da leksik tahlil uchun ishlatiladigan doimiy iboralarga asoslangan vositani amalga oshirdi kompilyator dizayn.[7]

Ushbu odatiy iboralarning asl shakllarining ko'pgina variantlarida ishlatilgan Unix[10] dasturlari Bell laboratoriyalari 1970-yillarda, shu jumladan vi, lex, sed, AWK va expr va boshqa dasturlarda Emak. Regexes keyinchalik keng ko'lamli dasturlar tomonidan qabul qilingan bo'lib, ushbu dastlabki shakllar standartlashtirilgan POSIX.2 1992 yilda standart.

1980-yillarda murakkab regexlar paydo bo'ldi Perl, dastlab tomonidan yozilgan regex kutubxonasidan olingan Genri Spenser (1986), keyinchalik uning dasturini yozgan Kengaytirilgan muntazam iboralar uchun Tcl.[13] Tcl kutubxonasi gibrid hisoblanadi NFA /DFA takomillashtirilgan ishlash xususiyatlari bilan amalga oshirish. Spenserning Tcl ekspresatsiyasini muntazam ravishda amalga oshirishni o'z ichiga olgan dasturiy ta'minot loyihalari PostgreSQL.[14] Keyinchalik Perl ko'plab yangi funktsiyalarni qo'shish uchun Spenserning asl kutubxonasini kengaytirdi.[15] Dizaynidagi sa'y-harakatlarning bir qismi Raku (ilgari Perl 6 deb nomlangan) Perlning regex integratsiyasini takomillashtirish va ularning ko'lamini va imkoniyatlarini oshirish uchun ta'rif berishga imkon beradi. ifoda grammatikasini tahlil qilish.[16] Natijada a mini-til deb nomlangan Raku qoidalari, ular Raku grammatikasini aniqlashda va dasturchilarga tilda vositani taqdim qilishda ishlatiladi. Ushbu qoidalar Perl 5.x regexes-ning mavjud xususiyatlarini saqlab qoladi, lekin bunga imkon beradi BNF a uslubining ta'rifi rekursiv tushish tahlilchisi pastki qoidalar orqali.

Hujjatlar va ma'lumotlar bazasini modellashtirish uchun tuzilgan axborot standartlarida regexlardan foydalanish 1960 yillarda boshlangan va 1980 yillarda sanoat standartlari kabi kengaygan. ISO SGML (ANSI "GCA 101-1983" tomonidan taqdim etilgan) birlashtirilgan. Ning yadrosi tuzilmaning spetsifikatsiyasi tili standartlar regexlardan iborat. Uning ishlatilishi DTD elementlar guruhi sintaksisi.

1997 yildan boshlab, Filipp Hazel ishlab chiqilgan PCRE Perl regex funksiyasini yaqindan taqlid qilishga urinadigan va ko'plab zamonaviy vositalar, shu jumladan ishlatiladigan (Perl Compatible Regular Expressions). PHP va Apache HTTP Server.

Bugungi kunda regexlar dasturlash tillarida, matnni qayta ishlash dasturlarida (xususan) keng qo'llab-quvvatlanmoqda lekserlar ), rivojlangan matn muharrirlari va boshqa ba'zi dasturlar. Regex-ning yordami standart kutubxona ko'plab dasturlash tillaridan, shu jumladan Java va Python va boshqalarning sintaksisiga, shu jumladan Perl va ECMAScript. Regex funksionalligini amalga oshirish ko'pincha a deb nomlanadi regex dvigateliva bir qator kutubxonalar qayta foydalanish uchun mavjud. 2010 yillarning oxirlarida bir nechta kompaniyalar apparatlarni taklif qila boshladilar, FPGA,[17] GPU[18] amalga oshirish PCRE mos regex dvigatellari ga nisbatan tezroq Markaziy protsessor amalga oshirish.

Asosiy tushunchalar

Odatda "a" deb nomlangan doimiy ibora naqsh, belgilaydi a o'rnatilgan ma'lum bir maqsad uchun zarur bo'lgan satrlar. Sonli qatorlar qatorini belgilashning oddiy usuli bu uning ro'yxati elementlar yoki a'zolar. Biroq, ko'pincha ixcham yo'llar mavjud: masalan, "Handel", "Händel" va "Haendel" uchta qatorlarini o'z ichiga olgan to'plam naqsh bilan belgilanishi mumkin. H (ä | ae?) Ndel; biz bu naqsh deymiz gugurt uchta ipning har biri. Ko'pchilikda rasmiyatchilik, agar ma'lum bir to'plamga mos keladigan kamida bitta doimiy ibora mavjud bo'lsa, unda unga mos keladigan cheksiz ko'p boshqa doimiy iboralar mavjud - spetsifikatsiya noyob emas. Ko'pgina formalizmlar doimiy iboralarni qurish uchun quyidagi operatsiyalarni taqdim etadi.

Mantiqiy "yoki"
A vertikal chiziq alternativalarni ajratib turadi. Masalan, kulrang|kulrang "kulrang" yoki "kulrang" ranglarga mos kelishi mumkin.
Guruhlash
Qavslar ning ko'lami va ustunligini aniqlash uchun ishlatiladi operatorlar (boshqa maqsadlar qatorida). Masalan, kulrang | kulrang va gr(a|e)y ikkalasi ham "kul" yoki "kul" to'plamini tavsiflovchi ekvivalent naqshlardir.
Miqdor
A miqdoriy a keyin nishon (masalan, belgi) yoki guruh oldingi elementning paydo bo'lishiga qanchalik tez-tez ruxsat berishini belgilaydi. Eng keng tarqalgan miqdoriy ko'rsatkichlar so'roq belgisi ?, yulduzcha * (dan olingan Kleene yulduzi ), va plyus belgisi + (Kleene plus ).
?Savol belgisi ko'rsatmoqda nol yoki bitta oldingi elementning paydo bo'lishi. Masalan, colou? r ikkala "rang" va "rang" bilan mos keladi.
*Yulduzcha ko'rsatmoqda nol yoki undan ko'p oldingi elementning paydo bo'lishi. Masalan, ab * c "ac", "abc", "abbc", "abbbc" va boshqalar bilan mos keladi.
+Plyus belgisi bildiradi bir yoki bir nechtasi oldingi elementning paydo bo'lishi. Masalan, ab + c "abc", "abbc", "abbbc" va boshqalarga mos keladi, ammo "ac" emas.
{n}[19]Oldingi narsa to'liq mos keladi n marta.
{min,}[19]Oldingi narsa mos keltirilgan min yoki undan ko'p marta.
{min, max}[19]Oldingi narsa hech bo'lmaganda mos keladi min marta, lekin ortiq emas maksimal marta.
Joker belgilar

Joker belgilar . har qanday belgiga mos keladi. Masalan, a.b "a" o'z ichiga olgan har qanday qatorga, keyin boshqa har qanday belgiga va keyin "b" ga mos keladi, a. * b "a" o'z ichiga olgan har qanday qatorga, keyin esa "b" belgisiga mos keladi.

Ushbu konstruktsiyalar raqamlardan va +, -, × va ÷ amallaridan arifmetik ifodalarni tuzish kabi o'zboshimchalik bilan murakkab ifodalarni hosil qilish uchun birlashtirilishi mumkin. Masalan, H (ae? | Ä) ndel va H(a|ae|ä)ndel ikkalasi ham avvalgi misol bilan bir xil satrlarga mos keladigan to'g'ri naqshlar, H (ä | ae?) Ndel.

Aniq sintaksis chunki doimiy iboralar vositalar orasida va kontekstda farq qiladi; batafsilroq ma'lumot berilgan § Sintaksis.

Rasmiy til nazariyasi

Doimiy iboralar tasvirlab beradi oddiy tillar yilda rasmiy til nazariyasi. Ular xuddi shunday ifodali kuchga ega muntazam grammatikalar.

Rasmiy ta'rif

Doimiy ifodalar qatorlar to'plamini bildiruvchi doimiylardan va shu to'plamlar ustidagi amallarni bildiruvchi operator belgilaridan iborat. Quyidagi ta'rif standart bo'lib, rasmiy til nazariyasi bo'yicha ko'pgina darsliklarda shunday topilgan.[20][21] Sonli berilgan alifbo Σ, quyidagi doimiylar doimiy ifodalar sifatida aniqlanadi:

  • (bo'sh to'plam∅ to'plamini belgilaydigan ∅.
  • (bo'sh satr ) ε faqat "bo'sh" qatorni o'z ichiga olgan to'plamni belgilaydi, unda umuman belgilar yo'q.
  • (so'zma-so'z belgi ) a Σ faqat belgini o'z ichiga olgan to'plamni bildiruvchi a.

R va S doimiy ifodalarini hisobga olgan holda, ular ustida quyidagi operatsiyalar aniq ifodalarni hosil qilish uchun belgilanadi:

  • (birlashtirish ) (RS) R tomonidan qabul qilingan qatorni va S tomonidan qabul qilingan qatorni (shu tartibda) birlashtirish orqali olinadigan qatorlar to'plamini bildiradi. Masalan, R {"ab", "c"} va S {"d", "ef"} deb belgilansin. Keyin, (RS) {"abd", "abef", "cd", "cef"} ni bildiradi.
  • (almashinish ) (R | S) belgisini bildiradi birlashma o'rnatish Masalan, R va S tomonidan tavsiflangan to'plamlar to'plami, masalan, R {"ab", "c"} ni va S {"ab", "d", "ef"} ni ifodalasa (R | S) {"ab", "c", "d", "ef"} ni tavsiflaydi.
  • (Kleene yulduzi ) (R *) eng kichikni bildiradi superset tomonidan tasvirlangan to'plamning R ε va yopiq torli birikma ostida. Bu har qanday sonli sonni (shu jumladan nolni) R tomonidan tavsiflangan to'plamdan birlashtirish orqali amalga oshiriladigan barcha satrlar to'plami, masalan, agar R {"0", "1"} ni bildirsa, (R *) barcha cheklanganlar to'plamini bildiradi ikkilik qatorlar (shu qatorda bo'sh satr). Agar R {"ab", "c"} belgisini bildirsa, (R *) {ε, "ab", "c", "abab", "abc", "cab", "cc", "ababab", "abcab", ...} ni bildiradi.

Qavslar ichidan qochish uchun Kleen yulduzi birinchi o'ringa, so'ngra biriktirishga, so'ngra almashtirishga ega deb taxmin qilinadi. Agar noaniqlik bo'lmasa, qavslar chiqarib tashlanishi mumkin. Masalan, (ab) v sifatida yozilishi mumkin abcva a | (b (c *)) sifatida yozilishi mumkin a | bc *.Ko'pgina darsliklarda vertikal chiziq o'rniga almashtirish uchun +, + yoki ∨ belgilaridan foydalaniladi.

Misollar:

  • a | b * {ε, "a", "b", "bb", "bbb", ...} ni bildiradi
  • (a | b) * "a" va "b" dan boshqa belgilarsiz barcha qatorlar to'plamini, shu qatorda bo'sh qatorni bildiradi: {{, "a", "b", "aa", "ab", "ba", "bb" , "aaa", ...}
  • ab * (c | ε) "a", keyin nol yoki undan ko'p "b" lar va nihoyat ixtiyoriy ravishda "c" dan boshlanadigan qatorlar to'plamini bildiradi: {"a", "ac", "ab", "abc", "abb", "abbc" ", ...}
  • (0|(1(01*0)*1))* 3 ga ko'paytiriladigan ikkilik sonlar to'plamini bildiradi: {ε, "0", "00", "11", "000", "011", "110", "0000", "0011", "0110" , "1001", "1100", "1111", "00000", ...}

Ta'sirchan kuch va ixchamlik

Muntazam iboralarning rasmiy ta'rifi maqsadga muvofiq minimal va belgilashdan qochadi ? va +- ularni quyidagicha ifodalash mumkin: a + = aa *va a? = (a | ε). Ba'zan to'ldiruvchi operatori qo'shiladi, berish uchun umumlashtirilgan doimiy ifoda; Bu yerga Rv Σ * ga to'g'ri kelmaydigan barcha qatorlarga mos keladi R. Aslida, komplement operatori ortiqcha, chunki u boshqa ekspresiv quvvat bermaydi. Biroq, bu doimiy ifodani ancha ixchamlashtirishi mumkin - barcha komplement operatorlarini oddiy ifodadan chiqarib tashlash a sabab bo'lishi mumkin ikki marta eksponent uning uzunligini portlatish.[22][23]

Ushbu ma'noda doimiy iboralar oddiy tillarni, aniq qabul qilingan tillar sinfini ifodalashi mumkin aniqlangan cheklangan avtomatlar. Ammo ixchamlikda sezilarli farq mavjud. Oddiy tillarning ba'zi sinflarini faqat o'lchamlari kattalashib boradigan deterministik cheklangan avtomatlar tasvirlashi mumkin eksponent sifatida eng qisqa ekvivalent doimiy iboralar hajmida. Bu erda standart misol tillardirLk alifbo ustidagi barcha satrlardan iborat {a,b} kimniki kth- oxirgi harfga tenga. Bir tomondan, tavsiflovchi doimiy ibora L4 tomonidan berilgan.

Ushbu naqshni umumlashtirish Lk ifodasini beradi:

Boshqa tomondan, ma'lumki, tilni qabul qiladigan har bir deterministik cheklangan avtomat Lk kamida 2 bo'lishi kerakk davlatlar. Yaxshiyamki, oddiy iboralardan umumiygacha oddiy xaritalash mavjud nondeterministik cheklangan avtomatlar (NFAs), bu o'lchamdagi bunday portlashga olib kelmaydi; shu sababli, odatiy tillarning muqobil vakili sifatida ko'pincha NFA'lardan foydalaniladi. NFAlar - bu tip-3 ning oddiy o'zgarishi grammatika ning Xomskiy ierarxiyasi.[20]

Qarama-qarshi yo'nalishda, DFA tomonidan osonlikcha ta'riflanadigan ko'plab tillar mavjud, ular oddiy iborani osonlikcha ta'riflay olmaydilar. Masalan, berilganning haqiqiyligini aniqlash ISBN tamsayt bazasi modulini hisoblashni talab qiladi va 11-holatli DFA yordamida osonlikcha amalga oshiriladi. Shu bilan birga, 11 ga bo'linishning bir xil muammosiga javob beradigan odatiy ifoda kamida bir necha megabayt uzunlikda bo'ladi.[iqtibos kerak ]

Doimiy ifoda berilgan, Tompsonning qurilish algoritmi ekvivalent nondeterministik cheklangan avtomatni hisoblab chiqadi. Qarama-qarshi yo'nalishda konvertatsiya qilish orqali erishiladi Klaynning algoritmi.

Va nihoyat, shuni ta'kidlash joizki, ko'plab haqiqiy "doimiy ifoda" dvigatellari rasmiy til nazariyasi ma'nosida doimiy iboralar bilan tavsiflab bo'lmaydigan xususiyatlarni amalga oshiradilar; aksincha, ular amalga oshiradilar regexes. Qarang quyida bu haqida ko'proq ma'lumot olish uchun.

Doimiy iboralarning ekvivalentligini hal qilish

Yuqoridagi ko'plab misollarda ko'rinib turganidek, bir xil natijalarga erishish uchun doimiy ifodani tuzishning bir nechta usuli mavjud.

An yozish mumkin algoritm berilgan ikkita doimiy ibora uchun tasvirlangan tillarning teng yoki yo'qligini hal qiladi; algoritm har bir ifodani a ga kamaytiradi minimal deterministik cheklangan davlat mashinasi, va ularning mavjudligini aniqlaydi izomorfik (teng).

Muntazam iboralar uchun algebraik qonunlarni Gischerning misolida eng yaxshi tushuntirilgan usul yordamida olish mumkin: (yoki yo'qligini tekshirish uchunX+Y)* va (X* Y*)* barcha doimiy iboralar uchun bir xil muntazam tilni belgilang X, Y, ma'lum bir doimiy iboralar (yoki yo'qligini) tekshirish zarur va etarli (a+b)* va (a* b*)* alfavit bo'yicha bitta tilni belgilang Σ = {a,b}. Umuman olganda, tenglama E=F o'zgaruvchiga ega bo'lgan doimiy ekspresiya atamalari orasida, agar u faqat turli xil o'zgaruvchilardan o'rnini turli xil ramzlar konstantalari bilan almashtirsa bajariladi.[24][25]

Ishdan bo'shatishni ishlatish yordamida yo'q qilish mumkin Kleene yulduzi va birlashma o'rnatish hanuzgacha to'liq ifodali, ammo ehtimol ulardan foydalanishni cheklash mumkin bo'lgan doimiy iboralarning qiziqarli qismini topish.[tushuntirish kerak ] Bu hayratlanarli darajada qiyin muammo. Muntazam iboralar qanchalik sodda bo'lsa ham, ularni muntazam ravishda biron bir normal shaklga yozish uchun usul yo'q. O'tmishda aksiomaning etishmasligi yulduz balandligi muammosi. 1991 yilda, Dexter Kozen aksiomatizatsiya qilingan doimiy iboralar a Kleen algebra, tenglama va Shox moddasi aksiomalar.[26]1964 yilda Redko biron bir cheklangan aniq tenglama aksiomalar to'plami oddiy tillar algebrasini tavsiflay olmasligini isbotlagan edi.[27]

Sintaksis

Regex naqsh maqsadga mos keladi mag'lubiyat. Naqsh. Ning ketma-ketligidan iborat atomlar. Atom - bu regex naqshidagi bitta nuqta, u maqsad qatoriga mos kelishga harakat qiladi. Eng oddiy atom so'zma-so'zdir, ammo naqsh qismlarini atomga mos kelish uchun guruhlash foydalanishni talab qiladi ( ) metaxarakter sifatida. Metakarakterlar quyidagi shaklga yordam beradi: atomlar; miqdoriy ko'rsatkichlar qancha atom (va u a yoki yo'qligini aytib berish) ochko'z miqdoriy yoki yo'qmi); muqobil variantlarni taklif qiluvchi mantiqiy YOKI belgi va atom mavjudligini inkor etadigan mantiqiy YO'Q belgi; va orqaga qaytish havolalari atomlarning to'ldirilgan naqshining oldingi atomlariga murojaat qilish uchun. Match ipning barcha atomlariga mos kelganda emas, balki regexdagi barcha naqsh atomlariga mos kelganda amalga oshiriladi. G'oya shundan iboratki, so'zma-so'z imkoniyatlarning katta ro'yxatini tuzish o'rniga, belgilarning kichik bir naqshini ko'p sonli mumkin bo'lgan satrlarni anglatadi.

Regex protsessoriga qarab, o'n to'rtta metakarakter mavjud, ular bo'lishi mumkin yoki bo'lmasligi mumkin so'zma-so'z belgi ma'nosi, kontekstga qarab, yoki ular "qochib ketgan", ya'ni oldin an qochish ketma-ketligi, bu holda teskari chiziq . Zamonaviy va POSIX kengaytirilgan regexlar metasharakterlarni so'zma-so'z ma'nosiga qaraganda ko'proq ishlatishadi, shuning uchun "teskari egri chiziq" yoki moyil tish po'sti sindromi metakarakterning so'zma-so'z rejimga o'tishi mantiqan; lekin boshlab, to'rtta qavsli metakarterga ega bo'lish mantiqan to'g'ri keladi ( ) va { } birinchi navbatda so'zma-so'z bo'ling va metakarterga aylanish uchun odatiy ma'noda "qochib" qo'ying. Umumiy standartlar ikkalasini ham amalga oshiradi. Odatdagi metakarakterlar {}[]()^$.|*+? va . Qochish paytida metakarterga aylanadigan odatiy belgilar dswDSW va N.

Ajratuvchilar

Regexni dasturlash tiliga kiritishda ular odatiy mag'lubiyat sifatida ifodalanishi mumkin, shuning uchun odatda keltirilgan; masalan, bu regex bo'lgan C, Java va Python-da keng tarqalgan qayta sifatida kiritiladi "qayta". Biroq, ular ko'pincha chiziqlar bilan yoziladi ajratuvchilar, kabi / re / regex uchun qayta. Bu kelib chiqadi tahrir, qayerda / izlash uchun muharrir buyrug'i va ifoda / re / qatorlarning qatorini (naqshga mos keladigan) belgilash uchun ishlatilishi mumkin, ularni har ikki tomonning boshqa buyruqlari bilan birlashtirish mumkin, eng mashxur g / re / p kabi grep Ko'pchiligiga kiritilgan ("global regex print") Unix kabi asoslangan operatsion tizimlar Linux tarqatish. Shunga o'xshash konventsiya ishlatilgan sed, qaerda qidirish va almashtirish tomonidan berilgan s / qayta / almashtirish / va naqshlar vergul bilan birlashtirilib, qator qatorlarini xuddi shunday ko'rsatilishi mumkin / re1 /, / re2 /. Ushbu yozuv ayniqsa, uning ishlatilishi tufayli yaxshi ma'lum Perl, bu erda u sintaksisning oddiy mag'lubiyatidan farq qiluvchi qismini tashkil qiladi. Ba'zi hollarda, masalan sed va Perl, tarkib bilan to'qnashuvni oldini olish va tarkibidagi ajratuvchi belgining paydo bo'lishidan qochish uchun muqobil ajratuvchi vositalardan foydalanish mumkin. Masalan, sed buyrug'i s, /, X, o'rnini bosadi / bilan X, ajratuvchi sifatida verguldan foydalanish.

Standartlar

The IEEE POSIX standart uchta muvofiqlik to'plamiga ega: BRE (Asosiy oddiy iboralar),[28] ERE (Kengaytirilgan muntazam iboralar) va SRE (Oddiy oddiy iboralar). SRE eskirgan,[29] ikkalasi ham ta'minlaganidek, BRE foydasiga orqaga qarab muvofiqligi. Quyidagi pastki qism belgilar sinflari BRE va ERE uchun ham amal qiladi.

BRE va ERE birgalikda ishlaydi. ERE qo'shadi ?, +va |va bu metaxarakterlardan qochish zaruratini yo'q qiladi ( ) va { }, qaysiki talab qilinadi BRE da. Bundan tashqari, regexlar uchun POSIX standart sintaksisiga rioya qilingan ekan, ma'lum (hali POSIXga mos keladigan) dasturlarga xizmat ko'rsatish uchun qo'shimcha sintaksis mavjud bo'lishi mumkin va ko'pincha mavjud. POSIX.2 dasturning ba'zi bir xususiyatlarini aniqlanmagan holda qoldirgan bo'lsa ham, BRE va ERE BRE yoki ERE rejimlarini tanlash odatda qo'llab-quvvatlanadigan variant bo'lgan ko'plab vositalarning standart sintaksisi sifatida qabul qilingan "standart" ni taqdim etadi. Masalan, GNU grep quyidagi variantlarga ega: "grep -E"ERE uchun va"grep -G"uchun BRE (standart) va"grep -P" uchun Perl regexes.

Perl regexlari atom ifodalarining boy va kuchli to'plamiga ega bo'lib, amalda standartga aylandi. Perlda "asosiy" yoki "kengaytirilgan" darajalar mavjud emas. POSIX ERE-larda bo'lgani kabi, ( ) va { } qochib ketmasa, metakarakter sifatida qaraladi; boshqa metakarakterlar faqat kontekst asosida tom ma'noda yoki ramziy ma'noga ega ekanligi ma'lum. Qo'shimcha funktsiyalarga quyidagilar kiradi dangasa taalukli, orqa manbalar, qo'lga olish guruhlari deb nomlangan va rekursiv naqshlar.

POSIX asosiy va kengaytirilgan

In POSIX standart, asosiy muntazam sintaksis (BRE) talab qiladi metaxarakterlar ( ) va { } belgilangan bo'lishi () va {}, kengaytirilgan muntazam sintaksis (ERE) emas.

MetakarakterTavsif
^Ip ichidagi boshlang'ich pozitsiyasiga mos keladi. Chiziqqa asoslangan vositalarda u har qanday chiziqning boshlang'ich pozitsiyasiga mos keladi.
.Har qanday bitta belgiga mos keladi (ko'plab dasturlar bundan mustasno yangi qatorlar va aynan qaysi belgilar yangi satrlar deb hisoblansa, bu lazzat, belgilar kodlashi va platformaga xosdir, ammo chiziqli tasma belgisi kiritilgan deb taxmin qilish mumkin). POSIX qavsli ifodalar ichida nuqta belgisi to'g'ridan-to'g'ri nuqta bilan mos keladi. Masalan, a.c "abc" va boshqalar bilan mos keladi, ammo [a.c] faqat "a", "." yoki "c" bilan mos keladi.
[ ]Qavs ifodasi. Qavslar ichida joylashgan bitta belgiga mos keladi. Masalan, [abc] "a", "b" yoki "c" ga mos keladi. [a-z] "a" dan "z" gacha bo'lgan har qanday kichik harflarga mos keladigan oraliqni belgilaydi. Ushbu shakllarni aralashtirish mumkin: [abcx-z] "a", "b", "c", "x", "y" yoki "z" ga mos keladi [a-cx-z].

The - belgi, agar u oxirgi yoki birinchi bo'lsa (belgisidan keyin bo'lsa) so'zma-so'z belgi sifatida qaraladi ^, agar mavjud bo'lsa) qavs ichidagi belgi: [abc-], [-abc]. Orqa burilishdan qochishga yo'l qo'yilmasligini unutmang. The ] belgi qavs iflosiga kiritilishi mumkin, agar u birinchi bo'lsa (dan keyin) ^) belgi: [] abc].

[^ ]Qavslar ichida mavjud bo'lmagan bitta belgiga mos keladi. Masalan, [^ abc] "a", "b" yoki "c" dan boshqa har qanday belgiga mos keladi. [^ a-z] "a" dan "z" gacha bo'lgan kichik harf bo'lmagan har qanday bitta belgiga mos keladi. Xuddi shu tarzda, harflar va diapazonlarni aralashtirish mumkin.
$Ipning tugash holatiga yoki satr tugaydigan yangi satr oldidagi holatiga mos keladi. Chiziqqa asoslangan vositalarda u har qanday chiziqning tugash holatiga mos keladi.
( )Belgilangan subekspressiyani belgilaydi. Qavslar ichidagi satr keyinroq esga olinishi mumkin (keyingi yozuvga qarang, n). Belgilangan subekspressiya, shuningdek, blokirovka qiluvchi guruh deb ham ataladi. BRE rejimi talab qiladi ( ).
nNima bilan mos keladi nth belgilangan subekspressiya qaerga to'g'ri keladi n 1 dan 9 gacha bo'lgan raqam. Ushbu qurilish POSIX.2 standartida noaniq aniqlangan. Ba'zi vositalar to'qqizdan ortiq suratga olish guruhlariga murojaat qilishlariga imkon beradi. Orqa yo'nalish sifatida ham tanilgan.
*Oldingi elementga nol yoki undan ko'p marta mos keladi. Masalan, ab * c "ac", "abc", "abbbc" va boshqalarga mos keladi. [xyz] * "", "x", "y", "z", "zx", "zyx", "xyzzy" va hk. (ab) * "", "ab", "abab", "ababab" va boshqalar.
{m,n}Hech bo'lmaganda oldingi elementga mos keladi m va ko'pi bilan n marta. Masalan, a {3,5} faqat "aaa", "aaaa" va "aaaaa" bilan mos keladi. Bu bir necha eski regex misollarida topilmaydi. BRE rejimi talab qiladi {m,n}.

Misollar:

  • .da "shlyapa", "mushuk" va "bat" ni o'z ichiga olgan "at" bilan tugagan har qanday uchta belgidan iborat qatorga mos keladi.
  • [hc] at "shapka" va "mushuk" bilan mos keladi.
  • [^ b] ot mos keladigan barcha satrlarga mos keladi .da "ko'rshapalak" dan tashqari.
  • [^ hc] da mos keladigan barcha satrlarga mos keladi .da "shapka" va "mushuk" dan tashqari.
  • ^ [hc] da "shapka" va "mushuk" bilan mos keladi, lekin faqat ip yoki satr boshida.
  • [hc] $ dan "shapka" va "mushuk" bilan mos keladi, lekin faqat ip yoki chiziq oxirida.
  • [.] "[" va "]" bilan o'ralgan har qanday bitta belgiga mos keladi, chunki qavslar qochib ketadi, masalan: "[a]" va "[b]".
  • s. * n ga mos keladigan belgilar va undan keyin nol yoki undan ortiq belgilar, masalan: "s" va "saw" va "seed".

POSIX kengaytirilgan

Metakarakterlarning ma'nosi qochib ketgan POSIX kengaytirilgan muntazam ifodasidagi ba'zi belgilar uchun teskari chiziq bilan teskari yo'naltirilgan (ERE) sintaksis. Ushbu sintaksis yordamida teskari chiziq metakarakterni so'zma-so'z belgi sifatida ko'rib chiqilishiga olib keladi. Masalan, masalan ( ) hozir ( ) va { } hozir { }. Bundan tashqari, qo'llab-quvvatlash o'chiriladi n orqa havolalar va quyidagi metakarterlar qo'shiladi:

MetakarakterTavsif
?Oldingi element nolga yoki bir martaga to'g'ri keladi. Masalan, ab? c faqat "ac" yoki "abc" bilan mos keladi.
+Oldingi elementga bir yoki bir necha marta mos keladi. Masalan, ab + c "abc", "abbc", "abbbc" va boshqalarga mos keladi, ammo "ac" emas.
|Tanlov (alternatsiya yoki set birlashmasi deb ham ataladi) operatori operatorga yoki operatordan oldingi yoki keyingi ifodalarga mos keladi. Masalan, abc | def "abc" yoki "def" bilan mos keladi.

Misollar:

  • [hc]? at "at", "shapka" va "mushuk" o'yinlari.
  • [hc] * ot "at", "shapka", "mushuk", "hhat", "chat", "hcat", "cchchat" va boshqalar.
  • [hc] + at "shapka", "mushuk", "hhat", "chat", "hcat", "cchchat" va boshqalarga mos keladi, ammo "at" emas.
  • mushuk | it "mushuk" yoki "it" bilan mos keladi.

POSIX kengaytirilgan muntazam iboralaridan ko'pincha zamonaviy Unix yordam dasturlari bilan foydalanish mumkin buyruq satri bayroq -E.

Belgilar sinflari

Belgilar sinfi - bu so'zma-so'z kelishuvdan keyingi eng asosiy regex tushunchasi. Belgilarning bitta kichik ketma-ketligi belgilarning kattaroq to'plamiga mos keladi. Masalan, [A-Z] ingliz tilidagi katta harflar uchun alifboni anglatadi va d har qanday raqamni anglatishi mumkin. Belgilar sinflari ikkala POSIX darajasiga ham tegishli.

Kabi belgilar qatorini belgilaganda [a-Z] (ya'ni kichik harf bilan) a katta harfga Z), kompyuterning mahalliy sozlamalari tarkibni belgilarni kodlashning raqamli tartibida belgilaydi. Ular raqamlarni shu ketma-ketlikda saqlashi mumkin yoki buyurtma bo'lishi mumkin abc… zABC… Z, yoki aAbBcC… zZ. Shunday qilib POSIX standarti o'rnatilgan regex protsessori tomonidan ma'lum bo'lgan belgilar sinfini belgilaydi. Ushbu ta'riflar quyidagi jadvalda keltirilgan:

POSIXNostandartPerl / TclVimJavaASCIITavsif
[: ascii:][30]p{ASCII}[x00-x7F]ASCII belgilar
[: alnum:]p{Alnum}[A-Za-z0-9]Harfli raqamli belgilar
[: so'z:][30]www[A-Za-z0-9_]Harfli raqamli belgilar va "_"
VVV[^ A-Za-z0-9_]So'zsiz belgilar
[: alfa:]ap{Alfa}[A-Za-z]Alfavit belgilar
[: bo'sh:]sp{Bo'sh}[ ]Bo'sh joy va yorliq
b< >b(?<=V)(?=w)|(?<=w)(?=V)So'z chegaralari
B(?<=V)(?=V)|(?<=w)(?=w)So'zdan tashqari chegaralar
[: cntrl:]p{Cntrl}[x00-x1Fx7F]Belgilarni boshqarish
[: raqam:]ddp{Raqam} yoki d[0-9]Raqamlar
D.D.D.[^0-9]Raqamli bo'lmagan raqamlar
[: grafik:]p{Grafik}[x21-x7E]Ko'rinadigan belgilar
[: pastki:]lp{Pastroq}[a-z]Kichik harflar
[: chop etish:]pp{Chop etish}[x20-x7E]Ko'rinadigan belgilar va kosmik belgi
[: punkt:]p{Punkt}[][!"#$%&'()*+,./:;<=>?@^_`{|}~-]Tinish belgilari
[: bo'shliq:]s_sp{Bo'shliq} yoki s[ vf ]Bo'shliq belgilar
SSS[^ vf]Bo'shliq bo'lmagan belgilar
[: yuqori:]sizp{Yuqori}[A-Z]Katta harflar
[: xdigit:]xp{XDigit}[A-Fa-f0-9]O'n oltinchi raqamlar

POSIX belgilar sinflari faqat qavs ifodalarida ishlatilishi mumkin. Masalan, [[: yuqori:]ab] katta harflar va "a" va "b" kichik harflariga mos keladi.

Ba'zi bir vositalar tushunadigan qo'shimcha POSIX bo'lmagan sinf [: so'z:], bu odatda aniqlanadi [: alnum:] ortiqcha ta'kidlash. Bu ko'plab dasturlash tillarida bu identifikatorlarda ishlatilishi mumkin bo'lgan belgilar ekanligini aks ettiradi. Muharrir Vim yanada ajralib turadi so'z va so'z boshi sinflar (yozuvlardan foydalangan holda w va h) chunki ko'plab dasturlash tillarida identifikatorni boshlashi mumkin bo'lgan belgilar boshqa holatlarda bo'lishi mumkin bo'lgan belgilar bilan bir xil emas: raqamlar odatda chiqarib tashlanadi, shuning uchun identifikator o'xshaydi hw* yoki [[: alfa:]_][[: alnum:]_]* POSIX yozuvida.

POSIX regex standartlari nima deyishini unutmang belgilar sinflari odatda deb nomlanadi POSIX belgilar sinflari ularni qo'llab-quvvatlaydigan boshqa regex lazzatlarida. Ko'pgina regex lazzatlari bilan atama belgilar sinfi POSIX nima chaqirishini tavsiflash uchun ishlatiladi qavs ifodalari.

Perl va PCRE

Uning ekspluatatsion kuchi va (nisbiy) o'qish qulayligi tufayli boshqa ko'plab yordam dasturlari va dasturlash tillari o'xshash sintaksisni qabul qildilar Perl masalan - Java, JavaScript, Yuliya, Python, Yoqut, Qt, Microsoft-ga tegishli .NET Framework va XML sxemasi. Kabi ba'zi tillar va vositalar Boost va PHP bir nechta regex lazzatlarini qo'llab-quvvatlash. Perl-derivativ regex dasturlari bir xil emas va odatda Perl 5.0-da 1994 yilda chiqarilgan funktsiyalarning bir qismini amalga oshiradi. Perl ba'zan boshqa tillarda topilgan xususiyatlarni o'z ichiga oladi. Masalan, Perl 5.10 dastlab PCRE va Python-da ishlab chiqilgan sintaktik kengaytmalarni amalga oshiradi.[31]

Dangasa moslik

Python va ba'zi boshqa dasturlarda (masalan, Java), uchta umumiy miqdor (*, + va ?) bor ochko'z sukut bo'yicha, chunki ular imkon qadar ko'proq belgilarga mos keladi.[32] Regex ".+" mag'lubiyatga qo'llaniladigan (shu jumladan, ikkita tirnoq)

"Ganymede, - deb davom etdi u, - Quyosh tizimidagi eng katta oy".

faqat birinchi qismga mos kelish o'rniga butun qatorga mos keladi (chunki butun chiziq ikki tirnoq bilan boshlanadi va tugaydi) "Ganymede". Ammo yuqorida aytib o'tilgan miqdorlar tuzilishi mumkin dangasa yoki minimal yoki istamay, iloji boricha kamroq belgilarga mos ravishda, savol belgisini qo'shib: ".+?" faqat mos keladi "Ganymede".[32]

Biroq, ba'zi holatlarda butun jumla hali ham mos kelishi mumkin. Savol-belgi operatori nuqta operatorining ma'nosini o'zgartirmaydi, shuning uchun ham bu kirishdagi ikkita tirnoq bilan mos kelishi mumkin. Shunga o'xshash naqsh ". *?" EOF agar bu satr bo'lsa, hali ham butun kirishga mos keladi:

"Ganymede, - deb davom etdi u, - Quyosh tizimidagi eng katta oy". EOF

Ikki tirnoq o'yinning bir qismi bo'lishi mumkin emasligini ta'minlash uchun nuqta o'rnini almashtirish kerak (masalan. "[^"]*"). Bu keltirilgan matn qismiga qo'shimcha qo'shiqchalarsiz mos keladi. (Belgilangan qo'shimchani moslashtirish imkoniyatini olib tashlash orqali, ya'ni. ", bu, shuningdek, dangasa o'yinni ochko'zlikka aylantirdi, shuning uchun ? endi kerak emas.)[iqtibos kerak ]

Egalik bilan mos kelish

Java-da miqdorlarni aniqlash mumkin egalik orqaga qaytishni o'chirib qo'yadigan (orqaga qaytish dvigatelida) plyus belgisini qo'shish orqali, hatto bu umumiy o'yinni muvaffaqiyatli bajarishiga imkon beradigan bo'lsa ham:[33] Regex paytida ".*" ipga qo'llaniladi

"Ganymede, - deb davom etdi u, - Quyosh tizimidagi eng katta oy".

butun qatorga, regexga to'g'ri keladi ".*+" qiladi umuman mos kelmaydi, chunki .*+ yakuniy ma'lumotlarni o'z ichiga olgan barcha kirishni sarflaydi ". Shunday qilib, egalik miqdorlari inkor qilingan belgilar sinflari bilan eng foydalidir, masalan. "[^"]*+", mos keladigan "Ganymede" bir xil ipga qo'llanganda.

Xuddi shu funktsiyani bajaradigan yana bir keng tarqalgan kengaytma - bu atomik guruhlash, bu qavsli guruh uchun orqaga qaytishni o'chirib qo'yadi. Odatda sintaksis (?> guruh). Masalan, esa ^ (wi | w) i $ ikkalasiga ham mos keladi wi va wii, ^ (?> wi | w) i $ faqat gugurt wii chunki dvigatel orqaga qaytishi taqiqlanadi va guruhni "w" qilib o'rnatishga harakat qiling.[34]

Egalik qiluvchi miqdorlarni ochko'z va dangasa miqdorlarga qaraganda osonroq amalga oshiradi va odatda ish vaqtida samaraliroq bo'ladi.[33]

Oddiy bo'lmagan tillar uchun naqshlar

Deyarli barcha zamonaviy ekspression kutubxonalarida mavjud bo'lgan ko'plab xususiyatlar ekspresiv quvvatni oshiradi oddiy tillar. Masalan, ko'pgina ilovalar pastki ekspressionlarni qavslar bilan birlashtirishga va ular bir xil ifodada mos keladigan qiymatni eslashga imkon beradi (orqa manbalar). Bu shuni anglatadiki, boshqa narsalar qatori naqsh "papa" yoki "WikiWiki" kabi takrorlangan so'zlar qatoriga mos kelishi mumkin. kvadratchalar rasmiy til nazariyasida. Ushbu torlar uchun naqsh (.+)1.

Kvadratchalar tili odatiy emas va shunday emas kontekstsiz, tufayli nasosli lemma. Biroq, naqshlarni moslashtirish cheksiz ko'p miqdordagi qayta havolalar bilan, ko'plab zamonaviy vositalar tomonidan qo'llab-quvvatlanmoqda kontekstga sezgir.[35] Istalgan miqdordagi havolalarni moslashtirishning umumiy muammosi To'liq emas, ishlatilgan backref guruhlari soni bo'yicha eksponent ravishda o'sib boradi.[36]

Biroq, bunday konstruktsiyalarni ta'minlaydigan ko'plab vositalar, kutubxonalar va dvigatellar hali ham ushbu atamadan foydalanadilar doimiy ifoda ularning naqshlari uchun. Bu doimiy ifoda atamasi turli ma'nolarga ega bo'lgan nomenklaturaga olib keldi rasmiy til nazariyasi va naqshlarni moslashtirish. Shu sababli, ba'zi odamlar ushbu atamani ishlatishga kirishdilar regex, regexpyoki oddiygina naqsh ikkinchisini tasvirlash. Larri Uoll, Perl dasturlash tili muallifi, ning dizayni haqida inshoda yozadi Raku:

"Doimiy iboralar" […] faqat haqiqiy doimiy iboralar bilan chegaradosh bog'liqdir. Shunga qaramay, bu atama naqshga mos keladigan dvigatellarimizning imkoniyatlari bilan o'sdi, shuning uchun men bu erda lingvistik zarurat bilan kurashmoqchi emasman. Ammo men ularni odatda "regexes" (yoki "regexen") deb atayman, agar men anglosakson kayfiyatida bo'lsam).[16]

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

Oddiy tillarni tavsiflashda topilmaydigan boshqa xususiyatlarga tasdiqlar kiradi. Ular orasida hamma joyda mavjud ^ va $, shuningdek, ba'zi bir kengaytirilgan kengaytmalar kabi ko'rinadi. Ular gugurt atrofini belgilaydilar va gugurtning o'ziga tushmaydilar, bu xususiyat faqat satrlarni qidirish uchun mos keladi. Ularning ba'zilari atrofni ham tilning bir qismi sifatida ko'rib, oddiy tilda taqlid qilish mumkin.[37]

Amalga oshirish muddati va ishlash vaqti

Eng kamida uchta farq bor algoritmlar berilgan regex mag'lubiyatga mos keladimi-yo'qligini hal qiladi.

Qadimgi va eng tezkor natijalar har bir narsaga imkon beradigan rasmiy til nazariyasiga bog'liq nondeterministik cheklangan avtomat (NFA) ga aylantirilishi kerak aniqlangan cheklangan avtomat (DFA). DFA aniq tarzda tuzilishi mumkin, so'ngra kiritilgan satrda birma-bir belgi bilan ishlaydi. Miqdorning muntazam ifodasi uchun DFA-ni qurish m vaqt va xotira narxiga ega O (2m), lekin uni o'lchamdagi qatorda ishlatish mumkin n o'z vaqtida O(n). E'tibor bering, ifodaning kattaligi raqamli kattalashtirgich kabi qisqartmalardan keyingi o'lchamdir.

Shu bilan bir qatorda, NFAni to'g'ridan-to'g'ri simulyatsiya qilish, asosan har bir DFA shtatini talabga binoan qurish va undan keyingi bosqichda uni yo'q qilish. Bu DFA-ni yopiq holda saqlaydi va eksponent qurilish narxidan qochadi, ammo ishchi xarajatlar ko'tariladi O(mn). Aniq yondashuv DFA algoritmi va yashirin yondashuv NFA algoritmi deb ataladi. Adding caching to the NFA algorithm is often called the "lazy DFA" algorithm, or just the DFA algorithm without making a distinction. These algorithms are fast, but using them for recalling grouped subexpressions, lazy quantification, and similar features is tricky.[38][39] Modern implementations include the re1-re2-sregex family based on Cox's code.

The third algorithm is to match the pattern against the input string by orqaga qaytish. This algorithm is commonly called NFA, but this terminology can be confusing. Its running time can be exponential, which simple implementations exhibit when matching against expressions like (a|aa)*b that contain both alternation and unbounded quantification and force the algorithm to consider an exponentially increasing number of sub-cases. This behavior can cause a security problem called Regular expression Denial of Service (ReDoS).

Although backtracking implementations only give an exponential guarantee in the worst case, they provide much greater flexibility and expressive power. For example, any implementation which allows the use of backreferences, or implements the various extensions introduced by Perl, must include some kind of backtracking. Some implementations try to provide the best of both algorithms by first running a fast DFA algorithm, and revert to a potentially slower backtracking algorithm only when a backreference is encountered during the match. GNU grep (and the underlying gnulib DFA) uses such a strategy.[40]

Sublinear runtime algorithms have been achieved using Boyer-Moore (BM) based algorithms and related DFA optimization techniques such as the reverse scan.[41] GNU grep, which supports a wide variety of POSIX syntaxes and extensions, uses BM for a first-pass prefiltering, and then uses an implicit DFA. Vu agrep, which implements approximate matching, combines the prefiltering into the DFA in BDM (backward DAWG matching). NR-grep's BNDM extends the BDM technique with Shift-Or bit-level parallelism.[42]

A few theoretical alternatives to backtracking for backreferences exist, and their "exponents" are tamer in that they are only related to the number of backreferences, a fixed property of some regexp languages such as POSIX. One naive method that duplicates a non-backtracking NFA for each backreference note has a complexity of time and space for a haystack of length n and k backreferences in the RegExp.[43] A very recent theoretical work based on memory automata gives a tighter bound based on "active" variable nodes used, and a polynomial possibility for some backreferenced regexps.[44]

Unicode

In theoretical terms, any token set can be matched by regular expressions as long as it is pre-defined. In terms of historical implementations, regexes were originally written to use ASCII characters as their token set though regex libraries have supported numerous other belgilar to'plamlari. Many modern regex engines offer at least some support for Unicode. In most respects it makes no difference what the character set is, but some issues do arise when extending regexes to support Unicode.

  • Supported encoding. Some regex libraries expect to work on some particular encoding instead of on abstract Unicode characters. Many of these require the UTF-8 encoding, while others might expect UTF-16, yoki UTF-32. In contrast, Perl and Java are agnostic on encodings, instead operating on decoded characters internally.
  • Supported Unicode range. Many regex engines support only the Asosiy ko'p tilli samolyot, that is, the characters which can be encoded with only 16 bits. Currently (as of 2016) only a few regex engines (e.g., Perl's and Java's) can handle the full 21-bit Unicode range.
  • Extending ASCII-oriented constructs to Unicode. For example, in ASCII-based implementations, character ranges of the form [x-y] are valid wherever x va y bor kod nuqtalari in the range [0x00,0x7F] and codepoint(x) ≤ codepoint(y). The natural extension of such character ranges to Unicode would simply change the requirement that the endpoints lie in [0x00,0x7F] to the requirement that they lie in [0x0000,0x10FFFF]. However, in practice this is often not the case. Some implementations, such as that of gawk, do not allow character ranges to cross Unicode blocks. A range like [0x61,0x7F] is valid since both endpoints fall within the Basic Latin block, as is [0x0530,0x0560] since both endpoints fall within the Armenian block, but a range like [0x0061,0x0532] is invalid since it includes multiple Unicode blocks. Other engines, such as that of the Vim editor, allow block-crossing but the character values must not be more than 256 apart.[45]
  • Ishga befarqlik. Some case-insensitivity flags affect only the ASCII characters. Other flags affect all characters. Some engines have two different flags, one for ASCII, the other for Unicode. Exactly which characters belong to the POSIX classes also varies.
  • Cousins of case insensitivity. As ASCII has case distinction, case insensitivity became a logical feature in text searching. Unicode introduced alphabetic scripts without case like Devanagari. For these, case sensitivity is not applicable. For scripts like Chinese, another distinction seems logical: between traditional and simplified. In Arabic scripts, insensitivity to initial, medial, final, and isolated position may be desired. In Japanese, insensitivity between hiragana va katakana is sometimes useful.
  • Normalizatsiya. Unicode has combining characters. Like old typewriters, plain letters can be followed by one or more non-spacing symbols (usually diacritics like accent marks) to form a single printing character, but also provides precomposed characters, i.e. characters that already include one or more combining characters. A sequence of a character + combining character should be matched with the identical single precomposed character. The process of standardizing sequences of characters + combining characters is called normalization.
  • New control codes. Unicode introduced amongst others, bayt buyurtma belgilari and text direction markers. These codes might have to be dealt with in a special way.
  • Introduction of character classes for Unicode blocks, scripts, and numerous other character properties. Block properties are much less useful than script properties, because a block can have code points from several different scripts, and a script can have code points from several different blocks.[46] Yilda Perl va java.util.regex library, properties of the form p{InX} yoki p{Block=X} match characters in block X va P{InX} yoki P{Block=X} matches code points not in that block. Xuddi shunday, p{Armenian}, p{IsArmenian}, yoki p{Script=Armenian} matches any character in the Armenian script. Umuman, p{X} matches any character with either the binary property X or the general category X. Masalan, p{Lu}, p{Uppercase_Letter}, yoki p{GC=Lu} matches any uppercase letter. Binary properties that are emas general categories include p{White_Space}, p{Alphabetic}, p{Math}va p{Dash}. Examples of non-binary properties are p{Bidi_Class=Right_to_Left}, p{Word_Break=A_Letter}va p{Numeric_Value=10}.

Foydalanadi

Regexes are useful in a wide variety of text processing tasks, and more generally mag'lubiyatga ishlov berish, where the data need not be textual. Umumiy dasturlarga quyidagilar kiradi ma'lumotlarni tekshirish, data scraping (ayniqsa web scraping ), data wrangling, oddiy tahlil qilish, ishlab chiqarish sintaksisni ajratib ko'rsatish systems, and many other tasks.

While regexes would be useful on Internet qidiruv tizimlari, processing them across the entire database could consume excessive computer resources depending on the complexity and design of the regex. Although in many cases system administrators can run regex-based queries internally, most search engines do not offer regex support to the public. E'tiborli istisnolarga quyidagilar kiradi Google kod qidiruvi va Exalead. However, Google Code Search was shut down in January 2012.[47]

Misollar

The specific syntax rules vary depending on the specific implementation, dasturlash tili, yoki kutubxona foydalanishda. Additionally, the functionality of regex implementations can vary between versiyalar.

Because regexes can be difficult to both explain and understand without examples, interactive websites for testing regexes are a useful resource for learning regexes by experimentation.This section provides a basic description of some of the properties of regexes by way of illustration.

The following conventions are used in the examples.[48]

metacharacter(s) ;; the metacharacters column specifies the regex syntax being demonstrated=~ m//           ;; indicates a regex o'yin operation in Perl=~ s///          ;; indicates a regex almashtirish operation in Perl

Also worth noting is that these regexes are all Perl-like syntax. Standart POSIX regular expressions are different.

Unless otherwise indicated, the following examples conform to the Perl programming language, release 5.8.8, January 31, 2006. This means that other implementations may lack support for some parts of the syntax shown here (e.g. basic vs. extended regex, ( ) va boshqalar (), or lack of d o'rniga POSIX [:digit:]).

The syntax and conventions used in these examples coincide with that of other programming environments as well.[49]

Meta­character(s)TavsifMisol[50]
.Normally matches any character except a newline.
Within square brackets the dot is literal.
$string1 = "Salom Dunyo";agar ($string1 =~ m/...../) {  chop etish "$string1 has length >= 5.";}

Chiqish:

Hello World has length >= 5.
( )Groups a series of pattern elements to a single element.
When you match a pattern within parentheses, you can use any of $1, $2, ... later to refer to the previously matched pattern.
$string1 = "Salom Dunyo";agar ($string1 =~ m/(H..).(o..)/) {  chop etish "We matched '$1' and '$2'.";}

Chiqish:

We matched 'Hel' and 'o W'.
+Matches the preceding pattern element one or more times.
$string1 = "Salom Dunyo";agar ($string1 =~ m/l+/) {  chop etish "There are one or more consecutive letter "l"'s in $string1.";}

Chiqish:

There are one or more consecutive letter "l"'s in Hello World.
?Matches the preceding pattern element zero or one time.
$string1 = "Salom Dunyo";agar ($string1 =~ m/H.?e/) {  chop etish "There is an 'H' and a 'e' separated by ";  chop etish "0-1 characters (e.g., He Hue Hee).";}

Chiqish:

There is an 'H' and a 'e' separated by 0-1 characters (e.g., He Hue Hee).
?Modifies the *, +, ? yoki {M,N}'d regex that comes before to match as few times as possible.
$string1 = "Salom Dunyo";agar ($string1 =~ m/(l.+?o)/) {  chop etish "The non-greedy match with 'l' followed by one or ";  chop etish "more characters is 'llo' rather than 'llo Wo'.";}

Chiqish:

The non-greedy match with 'l' followed by one or more characters is 'llo' rather than 'llo Wo'.
*Matches the preceding pattern element zero or more times.
$string1 = "Salom Dunyo";agar ($string1 =~ m/el*o/) {  chop etish "There is an 'e' followed by zero to many ";  chop etish "'l' followed by 'o' (e.g., eo, elo, ello, elllo).";}

Chiqish:

There is an 'e' followed by zero to many 'l' followed by 'o' (e.g., eo, elo, ello, elllo).
{M,N}Denotes the minimum M and the maximum N match count.
N can be omitted and M can be 0: {M} matches "exactly" M times; {M,} matches "at least" M times; {0,N} matches "at most" N times.
x* y+ z? is thus equivalent to x{0,} y{1,} z{0,1}.
$string1 = "Salom Dunyo";agar ($string1 =~ m/l{1,2}/) {  chop etish "There exists a substring with at least 1 ";  chop etish "and at most 2 l's in $string1";}

Chiqish:

There exists a substring with at least 1 and at most 2 l's in Hello World
[…]Denotes a set of possible character matches.
$string1 = "Salom Dunyo";agar ($string1 =~ m/[aeiou]+/) {  chop etish "$string1 contains one or more vowels.";}

Chiqish:

Hello World contains one or more vowels.
|Separates alternate possibilities.
$string1 = "Salom Dunyo";agar ($string1 =~ m/(Hello|Hi|Pogo)/) {  chop etish "$string1 contains at least one of Hello, Hi, or Pogo.";}

Chiqish:

Hello World contains at least one of Hello, Hi, or Pogo.
Matches a zero-width boundary between a word-class character (see next) and either a non-word class character or an edge; bilan bir xil

(^w|w$|Ww|wW).

$string1 = "Salom Dunyo";agar ($string1 =~ m/llo /) {  chop etish "There is a word that ends with 'llo'.";}

Chiqish:

There is a word that ends with 'llo'.
wMatches an alphanumeric character, including "_";
bilan bir xil [A-Za-z0-9_] in ASCII, and
[p{Alphabetic}p{GC=Mark}p{GC=Decimal_Number}p{GC=Connector_Punctuation}]

in Unicode,[46] qaerda Alifbo property contains more than Latin letters, and the Decimal_Number property contains more than Arab digits.

$string1 = "Salom Dunyo";agar ($string1 =~ m/w/) {  chop etish "There is at least one alphanumeric ";  chop etish "character in $string1 (A-Z, a-z, 0-9, _).";}

Chiqish:

There is at least one alphanumeric character in Hello World (A-Z, a-z, 0-9, _).
VMatches a bo'lmagan-alphanumeric character, excluding "_";
bilan bir xil [^A-Za-z0-9_] in ASCII, and
[^p{Alphabetic}p{GC=Mark}p{GC=Decimal_Number}p{GC=Connector_Punctuation}]

Unicode-da.

$string1 = "Salom Dunyo";agar ($string1 =~ m/W/) {  chop etish "The space between Hello and ";  chop etish "World is not alphanumeric.";}

Chiqish:

The space between Hello and World is not alphanumeric.
sMatches a whitespace character,
which in ASCII are tab, line feed, form feed, carriage return, and space;
in Unicode, also matches no-break spaces, next line, and the variable-width spaces (amongst others).
$string1 = "Salom Dunyo";agar ($string1 =~ m/s.*s/) {  chop etish "In $string1 there are TWO whitespace characters, which may";  chop etish " be separated by other characters.";}

Chiqish:

In Hello World there are TWO whitespace characters, which may be separated by other characters.
SMatches anything lekin a whitespace.
$string1 = "Salom Dunyo";agar ($string1 =~ m/S.*S/) {  chop etish "In $string1 there are TWO non-whitespace characters, which";  chop etish " may be separated by other characters.";}

Chiqish:

In Hello World there are TWO non-whitespace characters, which may be separated by other characters.
dMatches a digit;
bilan bir xil [0-9] in ASCII;
in Unicode, same as the p{Digit} yoki p{GC=Decimal_Number} property, which itself the same as the p{Numeric_Type=Decimal} mulk.
$string1 = "99 bottles of beer on the wall.";agar ($string1 =~ m/(d+)/) {  chop etish "$1 is the first number in '$string1'";}

Chiqish:

99 is the first number in '99 bottles of beer on the wall.'
D.Matches a non-digit;
bilan bir xil [^0-9] in ASCII or P{Digit} Unicode-da.
$string1 = "Salom Dunyo";agar ($string1 =~ m/D/) {  chop etish "There is at least one character in $string1";  chop etish " that is not a digit.";}

Chiqish:

There is at least one character in Hello World that is not a digit.
^Matches the beginning of a line or string.
$string1 = "Salom Dunyo";agar ($string1 =~ m/^He/) {  chop etish "$string1 starts with the characters 'He'.";}

Chiqish:

Hello World starts with the characters 'He'.
$Matches the end of a line or string.
$string1 = "Salom Dunyo";agar ($string1 =~ m/rld$/) {  chop etish "$string1 is a line or string ";  chop etish "that ends with 'rld'.";}

Chiqish:

Hello World is a line or string that ends with 'rld'.
AMatches the beginning of a string (but not an internal line).
$string1 = "Salom Dunyo";agar ($string1 =~ m/AH/) {  chop etish "$string1 is a string ";  chop etish "that starts with 'H'.";}

Chiqish:

HelloWorld is a string that starts with 'H'.
zMatches the end of a string (but not an internal line).[51]
$string1 = "Salom Dunyo";agar ($string1 =~ m/dz/) {  chop etish "$string1 is a string ";  chop etish "that ends with 'd
'.";}

Chiqish:

HelloWorld is a string that ends with 'd'.
[^…]Matches every character except the ones inside brackets.
$string1 = "Salom Dunyo";agar ($string1 =~ m/[^abc]/) { chop etish "$string1 contains a character other than "; chop etish "a, b, and c.";}

Chiqish:

Hello World contains a character other than a, b, and c.

Induksiya

Regular expressions can often be created ("induced" or "learned") based on a set of example strings. Bu sifatida tanilgan oddiy tillarni induktsiya qilish, and is part of the general problem of grammar induction yilda hisoblash orqali o'rganish nazariyasi. Formally, given examples of strings in a regular language, and perhaps also given examples of strings emas in that regular language, it is possible to induce a grammar for the language, i.e., a regular expression that generates that language. Not all regular languages can be induced in this way (see language identification in the limit ), but many can. For example, the set of examples {1, 10, 100}, and negative set (of counterexamples) {11, 1001, 101, 0} can be used to induce the regular expression 1⋅0* (1 followed by zero or more 0s).

Shuningdek qarang

Izohlar

  1. ^ Goyvaerts, Jan. "Regular Expression Tutorial - Learn How to Use Regular Expressions". www.regular-expressions.info. Arxivlandi asl nusxasi on 2016-11-01. Olingan 2016-10-31.
  2. ^ Mitkov, Ruslan (2003). Kompyuter tilshunosligining Oksford qo'llanmasi. Oksford universiteti matbuoti. p. 754. ISBN  978-0-19-927634-9. Arxivlandi asl nusxasidan 2017-02-28. Olingan 2016-07-25.
  3. ^ Lawson, Mark V. (17 September 2003). Cheklangan avtomatlar. CRC Press. 98-100 betlar. ISBN  978-1-58488-255-8. Arxivlandi asl nusxasidan 2017 yil 27 fevralda. Olingan 25 iyul 2016.
  4. ^ Kleene 1951.
  5. ^ Leung, Hing (16 September 2010). "Regular Languages and Finite Automata" (PDF). Nyu-Meksiko shtati universiteti. Arxivlandi asl nusxasi (PDF) 2013 yil 5-dekabrda. Olingan 13 avgust 2019. The concept of regular events was introduced by Kleene via the definition of regular expressions.
  6. ^ a b Thompson 1968.
  7. ^ a b Jonson va boshq. 1968 yil.
  8. ^ Kernighan, Brian (2007-08-08). "A Regular Expressions Matcher". Beautiful Code. O'Reilly Media. 1-2 bet. ISBN  978-0-596-51004-6. Arxivlandi from the original on 2020-10-07. Olingan 2013-05-15.
  9. ^ Ritchi, Dennis M. "An incomplete history of the QED Text Editor". Arxivlandi asl nusxasi 1999-02-21. Olingan 9 oktyabr 2013.
  10. ^ a b Aho & Ullman 1992, 10.11 Bibliographic Notes for Chapter 10, p. 589.
  11. ^ Aycock 2003, 2. JIT Compilation Techniques, 2.1 Genesis, p. 98.
  12. ^ Raymond, Erik S. iqtibos keltirgan holda Dennis Ritchi (2003). "Jargon File 4.4.7: grep". Arxivlandi asl nusxasi 2011-06-05 da. Olingan 2009-02-17.
  13. ^ "New Regular Expression Features in Tcl 8.1". Arxivlandi from the original on 2020-10-07. Olingan 2013-10-11.
  14. ^ "PostgreSQL 9.3.1 Documentation: 9.7. Pattern Matching". Arxivlandi from the original on 2020-10-07. Olingan 2013-10-12.
  15. ^ Devor, Larri and the Perl 5 development team (2006). "perlre: Perl regular expressions". Arxivlandi asl nusxasidan 2009-12-31. Olingan 2006-10-10.
  16. ^ a b Wall (2002)
  17. ^ "GROVF | Big Data Analytics Acceleration". grovf.com. Arxivlandi from the original on 2020-10-07. Olingan 2019-10-22.
  18. ^ "CUDA grep". bkase.github.io. Arxivlandi from the original on 2020-10-07. Olingan 2019-10-22.
  19. ^ a b v grep(1) man page
  20. ^ a b Hopcroft, Motwani & Ullman (2000)
  21. ^ Sipser (1998)
  22. ^ Gelade & Neven (2008)
  23. ^ Gruber & Holzer (2008)
  24. ^ Jay L. Gischer (1984). (Title unknown) (Technical Report). Stanford Univ., Dept. of Comp. Sc.
  25. ^ John E. Hopcroft va Rajeev Motwani va Jeffrey D. Ullman (2003). Avtomatika nazariyasi, tillar va hisoblash bilan tanishish. Yuqori Egar daryosi / NJ: Addison Uesli. ISBN  978-0-201-44124-6. Here: Sect.3.4.6, p.117-120. — This property need not hold for extended regular expressions, even if they describe no larger class than regular languages; qarz 121-bet.
  26. ^ Kozen (1991)[sahifa kerak ]
  27. ^ V.N. Redko (1964). "On defining relations for the algebra of regular events". Ukrainskii Matematicheskii Zhurnal. 16 (1): 120–126. Arxivlandi from the original on 2018-03-29. Olingan 2018-03-28. (Rus tilida)
  28. ^ ISO/IEC 9945-2:1993 Information technology – Portable Operating System Interface (POSIX) – Part 2: Shell and Utilities, successively revised as ISO/IEC 9945-2:2002 Information technology – Portable Operating System Interface (POSIX) – Part 2: System Interfaces, ISO/IEC 9945-2:2003, and currently ISO/IEC/IEEE 9945:2009 Information technology – Portable Operating System Interface (POSIX®) Base Specifications, Issue 7
  29. ^ The Single Unix Specification (Version 2)
  30. ^ a b "33.3.1.2 Character Classes — Emacs lisp manual — Version 25.1". gnu.org. 2016. Arxivlandi from the original on 2020-10-07. Olingan 2017-04-13.
  31. ^ "Perl Regular Expression Documentation". perldoc.perl.org. Arxivlandi asl nusxasidan 2009 yil 31 dekabrda. Olingan 8 yanvar, 2012.
  32. ^ a b "Regular Expression Syntax". Python 3.5.0 documentation. Python dasturiy ta'minot fondi. Arxivlandi asl nusxasi on 18 July 2018. Olingan 10 oktyabr 2015.
  33. ^ a b "Essential classes: Regular Expressions: Quantifiers: Differences Among Greedy, Reluctant, and Possessive Quantifiers". Java darsliklari. Oracle. Arxivlandi from the original on 7 October 2020. Olingan 23 dekabr 2016.
  34. ^ "Atomic Grouping". Regex Tutorial. Arxivlandi from the original on 7 October 2020. Olingan 24-noyabr 2019.
  35. ^ Cezar Câmpeanu and Kai Salomaa, and Sheng Yu (Dec 2003). "A Formal Study of Practical Regular Expressions". Xalqaro kompyuter fanlari asoslari jurnali. 14 (6): 1007–1018. doi:10.1142/S012905410300214X. Arxivlandi asl nusxasidan 2015-07-04. Olingan 2015-07-03. Theorem 3 (p.9)
  36. ^ "Perl Regular Expression Matching is NP-Hard". perl.plover.com. Arxivlandi from the original on 2020-10-07. Olingan 2019-11-21.
  37. ^ Wandering Logic. "How to simulate lookaheads and lookbehinds in finite state automata?". Kompyuter fanlari to'plami almashinuvi. Arxivlandi from the original on 7 October 2020. Olingan 24-noyabr 2019.
  38. ^ Cox (2007)
  39. ^ Laurikari (2009)
  40. ^ "gnulib/lib/dfa.c". If the scanner detects a transition on backref, it returns a kind of "semi-success" indicating that the match will have to be verified with a backtracking matcher.
  41. ^ Kearns, Steven (August 2013). "Sublinear Matching With Finite Automata Using Reverse Suffix Scanning". arXiv:1308.3822 [cs.DS ].
  42. ^ Navarro, Gonsalo (2001 yil 10-noyabr). "NR grep: tezkor va moslashuvchan naqshga mos keladigan vosita" (PDF). Dasturiy ta'minot: Amaliyot va tajriba. 31 (13): 1265–1312. doi:10.1002 / spe.411. Arxivlandi (PDF) from the original on 7 October 2020. Olingan 21 noyabr 2019.
  43. ^ "travisdowns/polyregex". 2019 yil 5-iyul. Arxivlandi asl nusxasidan 2020 yil 14 sentyabrda. Olingan 21 noyabr 2019.
  44. ^ Schmid, Markus L. (March 2019). "Regular Expressions with Backreferences: Polynomial-Time Matching Techniques". arXiv:1903.05896 [cs.FL ].
  45. ^ "Vim documentation: pattern". Vimdoc.sourceforge.net. Arxivlandi from the original on 2020-10-07. Olingan 2013-09-25.
  46. ^ a b "UTS#18 on Unicode Regular Expressions, Annex A: Character Blocks". Arxivlandi from the original on 2020-10-07. Olingan 2010-02-05.
  47. ^ Horowitz, Bradley (24 October 2011). "A fall sweep". Google Blog. Arxivlandi asl nusxasidan 2018 yil 21 oktyabrda. Olingan 4 may 2019.
  48. ^ The character 'm' is not always required to specify a Perl match operation. Masalan, m/[^abc]/ could also be rendered as /[^abc]/. The 'm' is only necessary if the user wishes to specify a match operation without using a forward-slash as the regex ajratuvchi. Sometimes it is useful to specify an alternate regex delimiter in order to avoid "ajratuvchi to'qnashuv ". See 'perldoc perlre Arxivlandi 2009-12-31 at the Orqaga qaytish mashinasi ' for more details.
  49. ^ Masalan, qarang Java in a Nutshell, p. 213; Python Scripting for Computational Science, p. 320; Dasturlash PHP, p. 106.
  50. ^ Note that all the if statements return a TRUE value
  51. ^ Konvey, Damian (2005). "Regular Expressions, End of String". Perlning eng yaxshi amaliyotlari. O'Rayli. p. 240. ISBN  978-0-596-00173-5. Arxivlandi from the original on 2020-10-07. Olingan 2017-09-10.

Adabiyotlar

Tashqi havolalar