Regularni izraz

Iz Wikipedije, proste enciklopedije
Jump to navigation Jump to search
Ujemanje vzorca
(?<=\.) {2,}(?=[A-Z])
Ujemata se vsaj dva zaporedna presledka, a le, če je pred njima pika (.), za njima pa velika začetnica.

Regularni izraz (angleško Regular expression, pogosto okrajšan v regex ali regexp),[1] včasih tudi racionalni izraz (rational expression)[2][3] je niz znakov, ki definira splošen iskalni vzorec v algoritmu za iskanje ali validiranje nizov. Skladnja regularnih izrazov je standardizirana in oblikovana za jedrnatost ter fleksibilnost, v obliki, ki jo je enostavno natipkati s tipkovnico s standardnim naborov znakov ASCII.

Vsak znak v regularnem izrazu je bodisi metaznak s posebnim pomenom, bodisi navaden znak z dobesednim pomenom. Za primer, v izrazu a. je »a« navaden znak, ».« pa metaznak, ki vrne ujemanje z vsakim znakom razen s prelomom vrstice. Izraz a. se bo torej ujemal z nizi »a «, »aX« ali »a0«, ne pa z »bX« ali »Xa«. S kombiniranjem navadnih in metaznakov lahko torej programer izdela regularen izraz, ki se bo ujemal s točno določenim nizom ali zelo splošnim vzorcem znakov v nizu, algoritem pa bo z njim procesiral posredovane nize in zaznal ujemanje ali ne. Po podobnem načelu delujejo nadomestni znaki (wildcard), ki pa so precej bolj omejeni z vzorci in imajo manjši nabor metaznakov (znan zgled je zvezdica *).

Regularni izrazi se uporabljajo za raznovrstne namene pri obdelavi besedil ali drugih nizov, denimo za iskanje in zamenjavo v oblikovalnikih in urejevalnikih besedil, splošnejših poizvedbah v iskalnikh ter za leksikalno analizo. Zmožnost ponujajo mnogi programski jeziki, bodisi že vgrajeno, bodisi s standardnimi knjižnicami.

Skladnja[uredi | uredi kodo]

Vzorec (pattern), ki se ujema s tarčnim nizom (string), je sestavljen iz zaporedja atomov. Atom je točka v vzorcu, ki jo algoritem primerja s tarčnim nizom. Najpreprostejši atom je dobeseden, možno pa je tudi združevati dele vzorca za ujemanje z atomom, v tem primeru je nujna uporaba ( ) kot metaznakov. Metaznaki tvorijo atome, kvantifikatorje, ki določajo število atomov, logični znak OR za skupek alternativ, logični znak NOT, ki negira atom, in povratne sklice. Ujemanje se zgodi, ko se ujemajo vsi atomi regexovega vzorca.

Obstaja približno 14 metaznakov (odvisno od procesorja), ki imajo svoj dobesedni pomen ali ne v odvisnosti od konteksta ali prisotnosti ubežnega znaka, ki je v regularnih izrazih leva poševnica \. Običajno so metaznaki {}[]()^$.|*+? in \, dobesedni znaki, ki se spremenijo v metaznake ob ubežnem znaku, pa dswDSW in N.

Osnovni koncepti[uredi | uredi kodo]

Vzorec definira množico nizov, ki zadostujejo podanim kriterijem. V najenostavnejši obliki lahko definira končno množico z naštevanjem njenih elementov, toda običajno obstaja bolj zgoščena oblika; za primer, množico treh nizov »Handel«, »Händel« in »Haendel« lahko definiramo bodisi z naštevanjem (Handel)|(Händel)|(Haendel), bodisi zgoščeno s H(ä|ae?)ndel. Pravimo, da se vzorec ujema s katerimkoli od teh treh nizov.

Večina izvedb vsebuje naslednje operacije za izdelavo regularnih izrazov:

Logični OR
Navpičnica ločuje alternative. Za primer, Matija|Mateja se ujema z »Matija« in »Mateja«
Združevanje
Oklepaji se med drugim uporabljajo za določanje obsega in vrstnega reda operatorjev. Ekvivalent zgornjemu zgledu je Mat(i|e)ja
Kvantifikacija
Kvantifikator na mestu za elementom (kot je znak) ali skupino določa, kolikokrat se lahko predhodni element pojavi.
? Vprašaj označuje nič ali eno ponovitev predhodnega elementa. Za primer, Hae?ndel se ujema s »Handel« in »Haendel«.
* Zvezdica označuje nič ali več ponovitev predhodnega elementa. Za primer, ab*c se ujema z »ac«, »abc«, »abbc«, »abbbc« itd.
+ Plus označuje eno ali več ponovitev predhodnega elementa. Za primer, ab+c se ujema z »abc«, »abbc«, »abbbc« itd., ne pa z »ac«.
{n} Predhodni element se ujema točno n-krat.
{min,} Predhodni element se ujema vsaj min-krat.
{min,max} Predhodni element se ujema vsaj min-krat, ne pa več kot max-krat.
Nadomestni znak
Nadomestni znak . se ujema s katerimkoli znakom. Za primer, a.b se ujema s katerimkoli nizom, ki se začne z »a«, nadaljuje z enim poljubnim znakom in konča z »b«. a.*b se ujema z nizom, ki se začne z »a« in vsebuje »b« na neki kasnejši lokaciji.

Ti konstrukti se lahko kombinirajo za izdelavo poljubno kompleksnih izrazov, podobno kot matematične operacije iz številk in operatorjev +, −, × ter ÷. Za primer, tako H(ae?|ä)ndel kot H(a|ae|ä)ndel sta veljavna vzorca, ki se ujemata z istimi nizi kot prejšnji zgled H(ä|ae?)ndel.

Sklici[uredi | uredi kodo]

  1. Goyvaerts, Jan. "Regular Expression Tutorial - Learn How to Use Regular Expressions". www.regular-expressions.info.
  2. Ruslan Mitkov (2003). The Oxford Handbook of Computational Linguistics. Oxford University Press. str. 754. ISBN 978-0-19-927634-9.
  3. Lawson, Mark V. (17 September 2003). Finite Automata. CRC Press. str. 98–100. ISBN 978-1-58488-255-8.