Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Reguláris kifejezések
2
bevezető A reguláris kifejezés (angolul regular expression) egy olyan, bizonyos szintaktikai szabályok szerint leírt string, amivel meghatározható stringek egy halmaza. Nevének rövidítésére gyakran a regexp vagy regex kifejezés használatos. A reguláris kifejezéseket sok szövegszerkesztő illetve segédprogram használja, főleg szövegek keresésekor vagy szövegek bizonyos minták szerinti kezelésekor. A reguláris kifejezéseket a jelsorozatokkal, stringekkel való műveleteknél több programozási nyelv is használja, illetve támogatja. Például a perl és atcl is rendelkezik direkt reguláris kifejezések elemzésére szolgáló szintaktikai elemzővel. A különböző unixdisztribúciókban lévő segédprogramok jelentős része (beleértve a sed szövegszerkesztőt és a grep szűrőt) támogatta először a reguláris kifejezések használatát
3
alapkoncepció A gyakran mintának nevezett reguláris kifejezés a jelsorozatok, stringek egy halmazát határozza meg. A minták használatával tömören megadhatók halmazok leírásai annélkül, hogy az összes elemüket fel kellene sorolni. Tegyük fel például, hogy egy halmaz a következő jelsorozatokat tartalmazza: Handel, Händel, és Haendel. Leírhatók-e a halmaz elemei a H(ä|ae?)ndel mintával (más szavakkal: mondhatjuk-e, hogy a mintához mindhárom string illeszkedik)? Amint az a későbbiekből kiderül, általában azonos halmazok különböző mintákkal is leírhatóak. A legtöbb formalizálásnál a következő operátorok használatával konstruálhatók meg a megfelelő reguláris kifejezések.
4
választás A függőleges vonal (|) a lehetséges alternatívákat választja el. Például a „kap|kép” minta alternatívákhoz illeszkedik a kap vagy a kép jelsorozat is. csoportosítás Zárójelek az operátorok hatáskörének elsőbbségének meghatározására szolgálnak. Például, a kap|kép és k(a|é)p minták különbözőek, de ugynazok a jelsorozatok illeszkednek hozzájuk (kap és kép). mennyiség jelzés A mennyiség jelző egy karakter, vagy csoport után azt határozza meg, hogy hányszor fordulhat elő a megelőző kifejezés. A leggyakoribb mennyiség jelzők a ?, a * és a+: ? A kérdőjel jelzi, hogy a megelőző kifejezés csak 0 vagy 1 esetben fordulhat elő. Például, a colou?r minta összeillik a color és a colour jelsorozatok közül bármelyikkel.
5
A csillag jelzi, hogy a megelőző kifejezés akárhány esetben fordulhat elő (beleértve a nullát is). Például, go*gle mintával összeillik a ggle, a gogle, a google stb. Nagyon fontos, hogy a * értelmezése alapvetően eltér a Windows-beli megszokott értelmezéstől! + A plusz karakter jelzi, hogy a megelőző kifejezés legalább 1 esetben fordulhat elő. Például a go+gle mintához illeszkedik a gogle, google stb. (de a ggle nem!). A fenti konstrukciók egymással kombinálva a különféle formák komplex ellenőrzését teszik lehetővé. Tehát a H(ae?|ä)ndel és a H(a|ae|ä)ndel érvényes, szabályos minták, és ezen túlmenően, mindkettőhöz illeszkednek a előző példaként megadott jelsorozatok.
6
Másik példa a előzőekben leírt operátorok kínálta lehetőségek kihasználásra:
Legyen a minta a következő: (nagy ?)*(apa|anya) A mintához illeszkedik a következő stringek közül bármelyik: apa, anya, nagy apa, nagy anya, nagy nagy apa, nagy nagy anya, nagyapa, nagyanya, nagy nagyapa, nagy nagyanya, nagy nagy nagyapa, nagy nagy nagyanya és így tovább. A reguláris kifejezések pontos szintaxisa a változó eszközök és alkalmazások miatt egységesen nem adható meg; a további részleteket lásd a Szintaxis résznél.
7
A reguláris kifejezések először az automata elmélet és formális nyelvek elmélete (mindkettő része a elméleti számítógép-tudománynak) kapcsán merültek fel. Ezek az elméletek a számítógép működésének modellezésénél (automaták), illetve ezek osztályozásánál és leírásásnál formális nyelvek voltak fontosak. Az 1940-es években Warren McCulloch és Walter Pitts az idegrendszer neuronokkal történő modellezésének leírásához használt egy kicsiny, egyszerű automatát. A matematikus Stephen Kleene ugyanezt a modellt matematikai jelölésekkel, az úgynevezett reguláris halmazok alkalmazásával írta le. Ken Thompson ezt a jelölési módot építette be az általa készített QED szövegszerkesztő programba. Ez került a Unix szerkesztőjébe (ed) is, ami a reguláris kifejezéseket használó grep elkészüléséhez vezetett. Azóta a reguláris kifejezések széles körben elterjedtek a Unix és a Unix-szerű rendszerek segédprogramjainál, amilyenek például az expr, az awk, az Emacs, a vi, a lex és a Perl. A Perl és a Tcl reguláris kifejezései a Henry Spencer által írt regexből származnak. Philip Hazel kifejleszti a pcre (Perl Compatible Regular Expressions) alkalmazást, amely képes szimulálni a Perl reguláris kifejezési funkcionalitásait, és több modern eszközben is megjelenik, többek között a PHP-ben, és az Apache-ban.
8
„Tradicionális” Unix reguláris kifejezések
Az „alap” Unix reguláris kifejezéseinek definíciói a POSIX megjelenésével ugyan elavultak, ennek ellenére széles körben használatosak a visszafelé kompatibilitás miatt. A legtöbb reguláris-kifejezés–felismerő Unix (segéd)program, például a grep és a sed alapértelmezésként használja még ezeket. Ebben a szintaxisban a legtöbb karaktert literalként kezelik – saját magukhoz illeszkednek csak („a” összeillik „a”-val, „(bc” összeillik „(bc”-hez stb.). A kivételek az illesztő-karaktereknek nevezett metakarakterek.
9
A különféle beállításoktól, értelmezésektől függően változhat a karakterek sorrend szerinti csoportosítása (például bizonyos beállítások szerint a karakterek sorrendje az abc..yzABC..YZ szerinti, míg más elv szerint az aAbBcC..yYzZ a sorrend) a – nem mindenki által elfogaA különféle beállításoktól, értelmezésektől függően változhat a karakterek sorrend szerinti csoportosítása (például bizonyos beállítások szerint a karakterek sorrendje az abc..yzABC..YZ szerinti, míg más elv szerint az aAbBcC..yYzZ a sorrend) a – nem mindenki által elfogadott – POSIX szabvány meghatározza a karakterek osztályokba vagy csoportokba sorolást a következő tábla alapján: Például: [[:upper:]ab] meghatározza az összes nagybetűt és a kisbetűs 'a'-t és 'b'-t. (Egy ASCII kódtáblán színesben mutatja a különböző POSIX osztályokat a következő link
10
Megjegyezzük, hogy a magyar ábécé ékezetes betűinek kezelése esetenként eltérő módon történik, ugyanis a különféle szabványok nem minden esetben térnek ki a különböző országokban használatos, az angol ábécé betűitől eltérő betűk kódolására, kezelésére. Gyakori probléma például, hogy az ábécé szerinti rendezésnél az ékezetes betűk rossz helyre kerülnek, mivel a karakterek kódjai – többnyire – a nem ékezetes karakterek kódjai után következnek, tehát rendezés szempontjából azok valóban „nincsenek sorban”. dott – POSIX szabvány meghatározza a karakterek osztályokba vagy csoportokba sorolást a következő tábla alapján: Például: [[:upper:]ab] meghatározza az összes nagybetűt és a kisbetűs 'a'-t és 'b'-t. (Egy ASCII kódtáblán színesben mutatja a különböző POSIX osztályokat a következő link
11
Megjegyezzük, hogy a magyar ábécé ékezetes betűinek kezelése esetenként eltérő módon történik, ugyanis a különféle szabványok nem minden esetben térnek ki a különböző országokban használatos, az angol ábécé betűitől eltérő betűk kódolására, kezelésére. Gyakori probléma például, hogy az ábécé szerinti rendezésnél az ékezetes betűk rossz helyre kerülnek, mivel a karakterek kódjai – többnyire – a nem ékezetes karakterek kódjai után következnek, tehát rendezés szempontjából azok valóban „nincsenek sorban”.
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.