Személyes eszközök
Keresés

 

A InfoWiki wikiből


Tartalomjegyzék

Reguláris kifejezések

A "regex" a regular expression' rövidítése, amelyet szabályos kifejezés-nek lehetne fordítani, de sok okból ezt csak részben magyarították, reguláris kifejezésként terjedt el a magyar terminológiában.

A regex tulajdonképpen egy szűrő, amivel néhány vagy akár tömérdek adat közül kiválogathatjuk a számunkra érdekeseket. Ezt mintaillesztés segítségével érjük el - megadunk egy szövegmintát, amelyet a rendszer egy string tartalomra próbál illeszteni. Elsődlegesen alkalmazzuk arra, hogy egy string alakja egyezik-e a mintával, de pl. string típus replace metódusa esetén alkalmazhatjuk szövegrészek keresésére is.

A regexp legegyszerűbb alakjával először a file parancsokban (dos, linux) találkozhatunk: ls *.txt (vagy dos alatt dir *.txt). Ekkor a *.txt mintát illeszti az operációs rendszer az alkönyvtárban található fájlok neveire.


Alapok

A reguláris kifejezéseket JS-ben a / karakterek határolják:

var nev= /\d{2}-\d{5}/
var szam = /[1-9][0-9]/
var email = /^\w+@\w+(\.\w{3})$/

Másik mód, amellyel egy reguláris kifejezés létrehozható:

var xx = new RegExp("minta",["flag-ek"]);

Ahol a "flag" lehet

  • g (global: globális keresés minden minta előfordulására)
  • i (ignoreCase: kis- és nagybetűs különbségek figyelmen kívül hagyása)
  • m (multiline: többsoros keresés)
var nev= new RegExp("\d{2}-\d{5}","i");

Flag-eket (módosítók) az első módszer esetén is megadhatunk (/regexp/[flag] alak):

var nev= /\d{2}-\d{5}/i

Belső

A regexp kifejezés belsejében operátorok, és közönséges karakterek fordulhatnak elő:

\ 	                           Escape
(), (?:), (?=), [] 	         Zárójelek
*, +, ?, {n}, {n,}, {n,m} 	   Összegzők
^, $, \metakarakter 	         Rögzítő elemek, sorozatok
| 	                           Választó
$ ( ) * + . [ ] ? \ / ^ { } | metakarakterek

Számos karakter a regexp számára speciális jelentéssel bír. Ilyen karakter (mint a fenti táblázat is mutatja) a plusz (+) karakter. Amennyiben egy reguláris kifejezés belsejében a plusz karaktert írjuk, annak speciális jelentését veszi figyelembe a regexp kiértékelő rendszer. Ha a kifejezésben magára a plusz karakterre akarunk utalni, és nem a speciális jelentésére, akkor azt az escape (\) karakterrel kell megjelölni (pl. \+). A fenti táblázatban szereplő metakarakterek mindegyikére igaz ez.

var osszeadas = /\d{2}\+\d{5}/

Ezek után vegyük sorra ezen karakterek speciális jelentését, és alkalmazhatóságát:

Ismétlődések

Az ismétlődést megengedő operátorok négyen vannak:

  • ? (kérdőjel) - megenged 0 vagy 1 ismétlődést
  • + (plusz) - megenged 1 vagy több ismétlődést
  • * (csillag) - megenged 0, 1, vagy több ismétlődést
  • {n,m} (kapcsos zárójelpár) - legalább n, legfeljebb m ismétlődést enged meg

Kérdőjel operátor

Az első fontos operátor a regexp-ek esetén a kérdőjel (?) operátor. Amennyiben egy karaktert követően fordul elő a ?, akkor az adott karakter ezen a helyen vagy 0 vagy 1 esetben fordulhat elő (vagy előfordul, vagy nem):

var magyar = /egg?yel/

A fenti mintában a ? előtt a g karakter szerepel. A minta szerint ezen a pozíción a g vagy előfordul, vagy nem. Ennek megfelelően ez a minta illeszkedik mind a egyel mind az eggyel szavakra.

Amennyiben a ? előtt nem egy karakter, hanem több karakter előfordulását kívánjuk ilyen módon megengedni, úgy azt gömbölyű zárójelpárba kell helyezni:

var honap = /jan(uár)?/

Ezen minta mind a jan mind a január szavakra illeszkedik.

A ? működése szerint a regexp kiértékelő rendszer mindíg úgy próbálkozik először, hogy feltételezi a ? által kezelt karakter jelenlétét a stringben. Ha így sikerül a minta illesztése, akkor továbblép a kiértékelésben. Ha nem sikerül, akkor megpróbálja a karakter nélkül illeszteni a mintát. Ha azzal sikerül, akkor továbblép. Ha azzal sem sikerül, akkor sikertelennek ítéli a minta illesztését, és továbblép.

Plusz operátor

A plusz összegző a ? -hez hasonló működésű, de nem engedi meg a nulla előfordulást, és megengedi a többszöri előfordulást is (legalább egyszer fordul elő).

var kereso = /go+gle/

A fenti minta megengedi a gogle, google, gooogle stb értékeket, de a ggle-t nem!

A + összegző is alkalmazható nem csak egyetlen, hanem több karakter esetén is. Ekkor szintén gömbölyű zárójelek segítségével azt csoportba kell foglalni:

var ismert_nota = /(mi)+, mi mozog a zöld leveles csipkebokorban/


Csillag operátor

A csillag (*) ismétlődést vezérlő operátor a ? és a + operátorok együttes működését fedi le. A * által védett karaketerek előfordulhatnak 0, 1, 2, ... példányban (vagyis mint a ? esetén nem kell egyáltalán az adott helyen szerepelni, de akár szerepelhet is, sőt, akár többször is szerepelhet).

var notafa = /(sal)?(la)*/

A fenti notafa minta illeszkedik a sal, salla, sallala , lala stb. mintákra.

Csoportosítások

Amikor minták egy csoportját képezzük, gyakran alkalmazunk gömbölyű zárójelpárt (...). Tesszük ezt azért, mert az ismétlődést vezérlő operátor jelentését nem egyetlen karakterre, hanem ezen csoportra kívánjuk alkalmazni. Másrészt, a függőleges vonal (|) opcionális választást leíró operátort akarjuk alkalmazni:

A függőleges vonal két mintát választ el egymástól. Jelentése: ezen a helyen vagy az egyik, vagy a másik minta fordulhat elő. Pl. a|b olvasata: ezen a helyen vagy a vagy b karakter szerepel.

Illesztések

Az ismétlődésekkel foglalkozó részben már rámutattunk, hogy a mintaillesztés során alapvetően valamilyen karaktereket keresünk (egyet, többet) a szövegben. A továbbiakban megmutatjuk a speciális illesztő metakarakterek jelentését:

  • . (pont) - illeszkedik bármilyen karakterre (kivéve a sorvége jelet)
  • ^ (kalap) - illeszkedik a sor elejére
  • $ (dollár) - illeszkedik a sor végére
  • [...] (szögletes zárójelpár) - a zárójelekben speciális minta-blokkot hozhatunk létre

Pont (.) bármire

A pont (.) meta-karakter illeszkedik bármilyen karakterre (kivéve a sorvége jelet).

var s = /m.r/

Az s minta illeszkedik a már, mar, mér szavak mindegyikére.

Kalap (^) sorelejére

Dollár ($) sorvégére

Szögletes zárójelpár

A szögletes zárójelpár belsejében speciális módon adhatunk meg karaktersorozatokat:

  • felsorolással - [abc] olvasata: az a vagy b vagy c karakterre illeszkedik (pl [kl]ép illeszkedik a kép és lép szavakra)
  • intervallum - [a-z] olvasata: bármely (angol) kisbetű
    • amennyiben a - (kötőjel) az elején vagy a végén szerepel, úgy magát a kötőjelet jelenti, vagyis [a-] olvasata: illeszkedik magára az a vagy a - karakterekre
    • amennyiben a szögletes zárójel tartalma a kalap (^) karakterrel kezdődik, úgy tagadást jelent - ekkor az illeszkedést úgy kell értelmezni, hogy ezen karakterekre nem, de minden másra igen: [^0-9] olvasata: bármi lehet itt, csak számjegy nem

Escape szekvenciák

  • \f - lapdobás karakter (form feed)
  • \r - kocsivissza (carriage return) karakter
  • \n - sorvége (linefeed) karakter
  • \t - vízszintes tabulátor (horizontal tab)
  • \v - vízszintes tabulátor (vertical tab)
  • \0 - nulla kódú ascii karakter (NUL)
  • [\b] - backspace
  • \s - elválasztó karakter ([\f\n\r\t\v\u00A0\u2028\u2029] rövidítése)
  • \S - bármi ami nem elválasztó karakter ([^\f\n\r\t\v\u00A0\u2028\u2029] rövidítése)
  • \w - bármilyen alfanumerikus karaket és az aláhúzás ([a-zA-Z0-9_] rövidítése)
  • \W - bámilyen nem alfanumerikus karakter ([^a-zA-Z0-9_] rövidítése)
  • \d - numerikus karakter ([0-9] rövidítése)
  • \D - nem numerikus karakter ([^0-9] rövidítése)
  • \b - szóhatár (the position between a word and a space).
  • \B - nem szóhatár ([^\b] rövidítése)
  • \xhh - hexadecimális számkóddal adott karakterre illesztés (pl \x20 a 32-es kódú (szóköz) karaktert jelöli)
  • \uhhhh - hexadecimális számkódal adott unicode karakter (pl \u0020)
  • \cX - control + karakter kombinációra illeszkedik (\cm illeszkedik a control-M -re)

Külső hivatkozások

A lap eredeti címe: „http://wiki.ektf.hu/wiki/Cgi-ea/page122
Nézetek
nincs sb_52.15.112.69 cikk