REGULÁRIS KIFEJEZÉSEK

 

A UNIX szépszámú adatmanipulációs eszközt nyújt a felhasználónak az editorokon kívül is. Az eszközök közül nagyon sok használ mintaillesztést, s a megadott mintára illeszkedő adatokon további feldolgozást hajt végre. Vannak olyan parancsok, ahol a felhasználó adja meg a keresendő mintát, ilyen a grep parancs, másokban rejtve dolgozik a mintakereső algoritmus. Ugyanezeket a mintaillesztési szabályokat használják a UNIX különböző editorai is, így a későbbiekben ismertetendő ed, vi vagy sed is, ez indokolja, hogy külön fejezetben foglalkozunk a reguláris kifejezésekkel. Reguláris kifejezések használatakor egy alkalmasint igen komplex mintát adunk meg (ez a reguláris kifejezés), s azt vizsgáljuk, hogy a feldolgozandó adatok (az esetek túlnyomó részében szöveges fájlok, tehát karakterláncok) melyik része illeszkedik a megadott mintára. A reguláris kifejezések karakterekből állnak, ezek közül néhány speciális jelentést hordoz, ezeket metakaraktereknek hívjuk, hasonlóan a shell-ben a fájlnév behelyettesítéskor használt speciális karakterekhez. Vigyázzunk azonban, a hasonlóság csak viszonylagos, s a két módszer a jelölésmódban is eltér egymástól.

Nézzük a reguláris kifejezéseket meghatározó szabályokat.

— Egy egyedülálló karakter, amely nem újsor karakter, és nem a . * [ \ ] ^ $ karakterek egyike, az önmagára illeszkedik. Ez magyarul azt jelenti, hogy ha például a keresendő minta — reguláris kifejezése — egy “a” betűt tartalmaz, akkor ez a vizsgált szövegben csakis egy darab “a” betűre fog illeszkedni. Hasonlóképpen, az alma reguláris kifejezés csupa “rendes” karakterből áll, amelyek mindegyike önmagára illeszkedik csupán, s így a fenti minta a vizsgált szövegben bárhol előforduló alma karakterláncra fog illeszkedni.

 

— A \c páros, ahol c egy látható karakter, a c karakterre illeszkedik a karakter literális értelmében. Tehát a \* illeszkedik a *-ra, a \\ pedig a \-re.

— A . (pont) karakter egy olyan reguláris kifejezés, amely bármelyik (nem újsor) karakterre illeszkedik. Így például az ab. minta illeszkedik az aba, abc, ... abz, ab0, stb karaktersorozatokra.

— Ha e egy reguláris kifejezés, akkor e* egy olyan reguláris kifejezés, amely e reguláris kifejezés 0 vagy többszöri előfordulását jelzi. Így az a* reguláris kifejezés illeszkedni fog az üres stringre is (hiszen abban nullaszor szerepel az a karakter), valamint az a, aa, aaa, aaaa, ... stb karakterláncokra.

— (A reguláris kifejezések teljes implementációiban szerepel a + jelölés is, ami a megelőző reguláris kifejezés egy vagy többszöri előfordulására illeszkedik. Belátható, hogy ez a jelölés helyettesíthető, hiszen például az a+ ekvivalens az aa* megadással. A legtöbb, reguláris kifejezéseket használó UNIX parancsban a szűkebb implementáció szerepel.)

[..] a szögletes zárójelbe tett karaktersorozat illeszkedik az abban a pozicióban lévő bármely, a zárójelben felsorolt karakterre. A karakterek felsorolására érvényes szabályok az alábbiak:

— Kódjukat tekintve egymás után következő karaktereket rövidíteni lehet a kötőjel használatával. Például 0-9a-z jelenti az összes számjegyet és az angol ábécé összes kisbetűjét.

— A nyitó zárójelet követő ^ jel, a felsorolt karakterek tagadása. Azaz [^0-9] jelenti bármely, nem szám karaktert.

— A ] zárójel csak a felsorolás első tagja lehet.

— A - karaktert a \- karakterpáros jelöli. (Ha '[' után vagy ']' előtt szerepel, a megelőző '\' elmaradhat.

— Két egymás után írt reguláris kifejezés szintén reguláris kifejezés. Például a [^0-9][0-9] kifejezés egy nem szám karaktert követő számkarakterre illeszkedik.

— Két egymástól | jellel vagy újsorral elválasztott reguláris kifejezés illeszkedik akár az egyik akár a másik kifejezésre. Így a [a-z]|\. kifejezés az adott pozícióban csak kisbetűt vagy egy pontot fogad el.

— A \(..\) tett reguláris kifejezés illeszkedik a zárójelbe tett kifejezésre, és egyben megjelöli azt.

 

— A ^ jel a sor elejére a $ jel a sor végére illeszti a mintát. Például a ^ $ kifejezés az üres sorra illeszkedik, a ^[^0-9]*$ kifejezés pedig a számot nem tartalmazó sorra.

— A \n kifejezés (ahol n egy szám) a zárójelezéssel kijelölt mintára hivatkozik, mégpedig a kijelölés sorrendjében. Így a ^\(.\)\(.\).*\2\1$ minta olyan sorokra illeszkedik, ahol a sor első két karaktere tükörszimmetrikus az utolsó két karakterre (pl. 'axc23xa').

— Néhány szabály a minta előfordulásának számosságára utal. Az egykarakteres reguláris kifejezést követő \{m,n\} sorozat, ahol m és n 256-nál kisebb, nem negatív egész, azt mondja, hogy a minta legalább m-szer és legfeljebb n-szer fordul elő egymás után. Ha csak az n szám van a zárójelpároson belül, annak jelentése, pontosan n-szer előforduló minta, ha m, van a zárójelpáron belül, annak jelentése legalább m előfordulás.

Az editorokról szóló további fejezetekben, és a feladatok között számos jó példát mutatunk a reguláris kifejezések széleskörű alkalmazására. Tapasztalt UNIX felhasználók sok munkát takarítanak meg a reguláris kifejezések használatával.

 

Tartalomjegyzék