Reg Exp

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 1

A RegEx vagy RegExp a Regular Expression rvid formja. Magyarul taln a "szablyos kifejezs" lenne a megfelel fordts.

Ez a lers azrt szletett, hogy elindtson a technika megismersben, kornt sem tekinthet teljesnek, a cikk vgn tallhat URL-eken lehet folytatni a barangolst a "szablyos kifejezsek" vilgban. Mindig babons flelemmel nztem a RegEx mintira. Volt dolgom egykt nyelnvel, de ez valami egszen bizarr dolog volt. Nem hinnm, hogy ltezik olyan tapasztalat aminek birtokban felfedezhet a RegEx sajtos logikja, szintaktikja, viszont az opertorok elolvassa utn szinte arculcsap a felismers: "ennyi az egsz?" Legalbb is ez lenne a cikk clja :) A RegEx lehetsget ad szablyok, azaz mintk egyszer lersra. Ezekkel a mintkkal aztn sok hasznos dolgot tehetnk. Kereshetnk rjuk egy stringben, vagy kicserlhetjk ket valamilyen szably szerint. Hasznlhatjuk adatellenrzsre vagy szerkezetek (pl. dtum) sztdarabolsra, rtelmezsre. Essnk tl a ktelez analgin: a DOS-bl jlismert joker karakterek is kifejezseket rnak le, amiknek fjlokat feleltetnk meg, vagy van egyezs, vagy nem. A ka*.doc s ka???.dockifejezsek kzl a kalap.doc mindkettnek, mg a kapa.doc csak az elsnek felel meg. Hogy mg egy kicsit rosszabb legyen, mieltt jobb lesz: DOS-os ka*.doc RegEx megfelelje:ka.*\.doc a ka???.doc peig nem ms, mint ka.{3}\.doc

RegEx opertorok
A DOS-os pldhoz hasonlan a mi mintink is konkrt karakterekbl (szavak, sztredkek), s specilis jelents opertorokbl plnek fel. Karakter megfeleltets . (pont) [karakterek] Brmilyen karakter: A b.ka kifejezsnek megfelel a bka s bika sz is. A kapcsoszrjelek kztt felsorolt karakterek valamelyikvel megegyez karakter: Ab[a]ka kifejezsnek megfelel a bka s baka sz, a bika viszont nem. A - (minusz) jellel tartomnyt is megadhatunk. Pldul [0-9] megfelel brmely szmjegynek vagy [a-zA-Z]brmely kis vagy nagybetnek. A kapcsoszrjelek kztt felsorolt karakterek egyikvel sem egyez karakter (az elz opertor tagadsa): A b[^]ka kifejezsnek nem megoldsa a bka. A baka s bikaviszont igen.

[^karakterek]

Tbbszrzs ? + * {m,n} A megelz minta 0 vagy 1 alkalommal fordul el: A borda.? kifejezs igaz a borda s abordal szavakra is. A megelz minta 1 vagy tbb alkalommal fordul el: A bo.+ka kifejezsnek megfelel aborka, a boka viszont nem. A megelz minta 0 vagy tbb alkalommal fordul el: A bo.*ka kifejezsnek mr megfelel aboka s borka is. Segtsgvel megadhat minimum s maximum vagy pontosan megadott szm elforduls - {3} pontosan 3 elforduls; {3,} legalbb 3 elforduls; {2,5} legalbb 2 legfeljebb 5 elforduls; {,10} legfeljebb 10 elforduls. A d.{,5}ny igaz minden esetben, halegfeljebb 5 karaktert kell helyettesteni, pldul a dolmny esetn. A diszkpatknyviszont mr nem akad fenn rajta.

Horgonyok Az elzekben nem szemlltettem, de a felsorolt kifejezsek akkor is igazak ha a vizsglt string belsejben tallhatk meg. A b.ka igaz a bikaviadal mintra is. ^ $ A minta eleje: Ezzel jelezhetjk, hogy a kifejezst a minta elejn keressk. A ^bkakifejezsnek megfelel a bkanyl minta, a kecskebka viszont nem.

A minta vge: Az elz horgonyhoz hasonlan a minta vgt testesti meg. A k$ mintnak megfelel minden erre vgzd sz (kerk, pk). Termszetesen kombinlhatk is. A ^p.k$ kifejezs csak akkor igaz, ha az input pontosan egy hrombets sz. A legpiknsabb nem megoldsa, ahogy a pikns sem. A pk vagy pk viszont j. Logika | () Vagylagos egyezs: Kt lehetsg kz tve brmelyikkel val egyezs tallatot produkl. Gyakorlati pldhoz picit elre kell ugorjunk, a norml (kerek) zrjelekre, jelen felhasznls viszont nem kvn klnsebb magyarzatot: ka(lap|bt) Kifejezsek csoportostsa: Nem csak a vagylagos egyezs az egyetlen lehetsges felhazsnls. Egy csoportot ltrehozva ellthatjuk paramterrel pldul a (hkusz)?pksegtsgvel a hkuszpk s pk szavak is megtallhatk. A csoportokra ksbb hivatkozhatunk is, ez csernl vagy stringek rtelmezsnl lesz hasznos.

Escape-els Ezek az opertorok lefednek nhny gyakran hasznlt karaktert is. Ha pldul egy pont karaktert nem specilis rtelmben szeretnnk hazsnlni, hanem egy pontknt a C-bl, PHP-bl, Javascriptbl megszokott mdon \ (backslash) karakterrel tudjuk megfosztani specilis jelentstl.

sszetett pldk
Dtum feldolgozs [0-9]{4}[^0-9]*[0-9]{2}[^0-9]*[0-9]{2} Hogy is olvasand a plda? [0-9]{4} ngy darab szmjegy (v); amelyet kvet [^0-9]* nulla vagy akr tbb NEM szmjegy karakter (esetleges elvlaszt); majd [0-9]{2} kt szmjegy (hnap); utna ismt [^0-9]* jhet elvlaszt; s vgl [0-9]{2} kt jabb szmjegy. Ezzel mg csak flmunkt vgeztnk. Tudunk azonostani egy dtumot, de nem tudunk hivatkozni az egyes tagokra. A kerekzrjellel emeljk ki azokat a csoportokat amik szmunkra rdekes adatokat hordoznak. ([0-9]{4})[^0-9]*([0-9]{2})[^0-9]*([0-9]{2}) A hasznlt nyelvnek megfelel stlusban (ltalban egy tmbben) kapjuk vissza a megjellt csoportok tartalmt a RegEx futtatsa utn. Pldul PHP-ben: $datum = "2006. 07. 22."; ereg ('([0-9]{4})[^0-9]*([0-9]{2})[^0-9]*([0-9]{2})', $datum, $talalat); var_dump ($talalat); Eredmnye a kvetkez: array(4) { [0]=> string(12) "2006. 07. 22" [1]=> string(4) "2006" [2]=> string(2) "07" [3]=> string(2) "22" } A tmb nulls sorszm rekeszbe kerl az egsz kifejezsnek megfelel minta (lthat, hogy a vgs pont nincs benne, hiszen a keresett kifejezsnk vget r a napot jell kt szmjeggyel). Az egyes sorszmtl kezdve a tmbbe kerltek az ltalunk (kerekzrjellel) megjellt csoportok. A kiindulsi dtum lehetett volna "2006-07-22" vagy "20060722" is, a kifejezs mindet megfejti. Bizonyos dtumformtumok nem ptoljk ki ktszmjegyre az adatokat. Pdlul "2006/7/22". Ilyenkor az elvlasztk jelenlte a dnt. Az elvlasztk kztt mindig van egy vagy tbb szmjegy: ([0-9]{4})[^0-9]*([0-9]+)[^0-9]*([0-9]+) Nzznk egy PHP pldt a csrre. A kvetkez fggvny a tetszlegesen elvlasztott dtumformtumot "-" jellel elvlasztottra konvertlja (ahogy pldul a MySQL szereti). $datum = "2006. 7. 22."; $ujdaum = ereg_replace ('([0-9]{4})[^0-9]*([0-9]+)[^0-9]*([0-9]+)[^0-9]*', '\1-\2-\3', $datum); echo ($ujdaum); // eredmnye: 2006-7-22 Itt megtoldottuk a mintt egy [^0-9]* kddal, hogy lenyeljk az esetleges elvlaszt jeleket a dtum vgrl. A \1 \2 \3 pedig referencik a zrjellel kiemelt csoportokra. E-mail ellenrzs ^[0-9a-z\.-]+@([0-9a-z-]+\.)+[a-z]{2,4}$ Olvassuk el: ^ a minta elejn; egy vagy tbb alfanumerikus karakter, a pont s ktjel is megengedett (A pont specilis karakter, egy backslash-sel jelljk, hogy nem szeretnnk, hogy most rtelmezze a RegEx motor. A minusz szintn specilis jelentssel br a kapcsoszrjelek kztt. Az esetben a backslash-mdszer nhny rtelmeznek gondot okoz, ezrt hogy megfosszuk specilis jelentstl az utols kell legyen a zr kapcsoszrjel eltt.) Ezek utn egy @(at) karakter kvetkezik; majd [0-9a-z-]+ egy vagy tbb alfanumerikus karakter; amit \. egy pont kvet. A mintt egy [a-z]{2,4} legalbb 2 legfejlebb 4 betbl ll rsz (TLD) zrja $. A kifejezs kzepn (kiemelt rsz) kpeznk egy csoportot, aminek engedlyeztk az ismtldst. Ennek hatsra nem csak a "user@domain.tld" felel meg, hanem ugyangy a "user@subhost.host.domain.tld" is. $email = "gipsz.jakab@szerver.szervezet.hu"; $megfelel = eregi ('^[0-9a-z\.-]+@([0-9a-z-]+\.)+[a-z]{2,4}$', $email);

You might also like