A Javascript programozási nyelv

Reguláris kifejezések

Reguláris kifejezések létrehozása

Reguláris kifejezésekkel szövegkeresési mintákat írhatunk le, ezen minták karakterláncokban karakterkombinációk megfeleltetésére használhatók. Egyik leggyakoribb felhasználása az űrlapok beviteli mezőinek ellenőrzése; például megvizsgálhatjuk, hogy a megadott e-mail cím formátuma megfelelő-e. A JS 1.2 és későbbi verzióiban van támogatás reguláris kifejezések használatára. JavaScriptben a reguláris kifejezések is objektumok. A RegExp beépített prototípus szolgál ezen kifejezések kezelésére, egy RegExp objektum egy megadott kifejezés mintáját tartalmazza. Rendelkezik olyan tulajdonságokkal és eljárásokkal, amelyek használatával karakterláncokban kereséseket és a találatok szövegcseréjét is elvégezheti.

Létrehozás

Reguláris kifejezést kétféleképpen hozhatunk létre:

  1. A RegExp konstruktorfüggvényével:

    reg = new RegExp(”minta”[,”kapcsolok”])

    (A kapcsolókról később még lesz bővebben.) A konstruktor használata futásidejű fordítást szolgáltat a reguláris kifejezés számára. Akkor érdemes használni, ha előre tudjuk, hogy a reguláris kifejezés mintája meg fog változni, vagy ha más forrásból érkezik, például felhasználói adatbevitelből, mivel az így megadott minta minden egyes hivatkozáskor újra kiértékelődik.

  2. Objektum inicializáló használatával:

    reg = /minta/[kapcsolok]

    Ebben az esetben a reguláris kifejezés előfordítódik, ha a reguláris kifejezés változatlan marad, a jobb teljesítmény érdekében ezt a megoldást érdemes használni.

Minták írása:

Egy reguláris kifejezés állhat egyszerű karakterekből, vagy egyszerű és speciális karakterek kombinációjából.

Egyszerű minta:

Az egyszerű mintákat közvetlen megfeleltetésre használjuk. Például a /men/ minta csak azoknak a karakterláncokban található karakterkombinációknak felel meg, ahol a "men" karakterek pontosan így, és ebben a sorrendben szerepelnek. Azaz, a megfeleltetés sikeres lesz a "Laci elment bevásárolni" karakterlánc esetén, viszont a "Nem engedem" karakterláncnál már nem, mivel ez nem tartalmazza pontosan a /men/ szövegrészt.

Speciális karakterek:

Természetesen gyakran a közvetlen megfeleltetésnél bonyolultabb keresési módokra van szükség, ezeket segítik a speciális karakterek. Például megadhatjuk, hogy az "m" után az "en" karakterek tetszőleges távolságra, de mindenképp benne legyenek a karakterláncban. Ennek megadása: /m*en/. A * jelenti azt, hogy az "m" karaktert 0 vagy több karakter követi, majd az "en" karakterek. Ekkor a "Nem engedem" szövegnél is sikeres lesz a megfeleltetés.

A következő táblázatban a reguláris kifejezésekben előfordulható speciális karakterek vannak felsorolva.

karakter jelentése
\ Vagy azt jelzi, hogy a következő karakter különleges és ne legyen betű szerint értelmezve (például az ‘s' karakterből a ‘\s' üres karaktert jelentő különleges karaktert hoz létre), vagy egy különleges karaktert alakít át úgy, hogy betű szerint legyen értelmezve (például a ‘\*' a ‘*' karaktert jelenti)
^ sor elejét egyezteti
$ sor végét egyezteti
* a megelőző karakter 0 vagy többszöri előfordulását írja elő
+ a megelőző karakter 1 vagy többszöri előfordulását írja elő
? a megelőző karakter 0 vagy egyszeri előfordulását írja elő
. tetszőleges karakter egyszeri előfordulása
{ } a megelőző karakter többszöri ismétlődését írja elő {n} pontosan n db előfordulás {n,m} n és m közötti előfordulás {n,} n vagy többszöri előfordulás
( ) a zárójelben lévő mintának megfelelő szöveget megjegyzi, lehetővé téve a későbbi felhasználását
[ ] a zárójelben megadott karakterhalmaz egy elemének előfordulását írja elő [n,m] n vagy m bármelyike [n-m] n és m közötti tartomány bármelyike [^n,m] inverz; bármi, csak nem n vagy m
| a két oldalán álló minták egyikének előfordulását írja elő (“vagy”)
[\b] visszatörlés karakter előfordulását írja elő
\cX kontrollkarakter előfordulását írja elő
\d számjegy előfordulását írja elő, megegyezik a következővel: [0-9]
\D az előző tagadása, azaz [^0-9]
\n soremelés előfordulását írja elő
\f lapdobás előfordulását írja elő
\t tabulátor előfordulását írja elő
\v vertikális tabulátor előfordulását írja elő
\r kocsivissza előfordulását írja elő
\s üres karakter előfordulását írja elő, azaz [ \f\t\v\r\n]
\S az előző tagadása, azaz [^ \f\t\v\r\n]
\w betű, számjegy vagy aláhúzás, azaz [0-9a-zA-Z_]
\W az előző tagadása, azaz [^0-9a-zA-Z_]

Kapcsolók

A reguláris kifejezéseknek van két opcionálisan használható kapcsolójuk, amelyek lehetővé teszik a globális és kis- és nagybetű-érzéketlen keresést. A globális kereséshez a 'g', a kis- és nagybetű-érzéketlen kereséshez pedig az 'i'kapcsoló használható. Ezek a kapcsolók használhatók külön, vagy együtt. A kapcsolók a reguláris kifejezés részei, később el nem vehetők, és hozzá sem adhatók.

Reguláris kifejezések használata

Reguláris kifejezéseket a RegExp objektum test és exec eljárásai, valamint a String objektum match, replace, search, és split eljárásai használnak.

eljárás neve leírása egyszeru példa a használatára
test Letesztel egy egyezést egy karatkerláncon, visszatérési értéke true vagy false. (RegExp objektum eljárása.) reg = /^.+@.+\..{2,6}$/; reg.test(“kati@mail.hu”) Megvizsgálja, hogy a paraméterként kapott sztring e-mail formátumú-e.
exec Keresést hajt végre egy karakterláncban, visszatérési értéke egy eredménytömb. (RegExp objektum eljárása.) reg =/a(b+)a/g; array = reg.exec("cabbabsbz"); A ‘aba', ‘abba', ‘abbba', stb. minták keresése a kapott sztringben.
match Keresést hajt végre egy karakterláncban, visszatérési értéke egy eredménytömb, vagy ha nincs egyezés, null. (String objektum eljárása.) str=”88sd433 p23ko"; array=str.match(/\d+\s/g); Olyan mintát keres, ahol egy vagy több számjegyet üres karakter követ.
replace/td> Keresést hajt végre egy karakterláncban, és az egyező szövegrészeket lecseréli az adott karakterláncra. (String objektum eljárása.) str=”hehe hee hee”; str.replace(/e+/,'a'); Eredménye: “haha ha ha”
search Letesztel egy egyezést egy karatkerláncon, visszatérési értéke az egyezés indexe, vagy -1, ha nincs egyezés. (String objektum eljárása.) reg=/^a(b+)a/g; int=reg.exec("abbabsbz"); Eredménye: 0. Mivel a reguláris kifejezés ‘^'-vel kezdődik, csak a sztring elején lehet egyezés.
split Egy reguláris kifejezést vagy egy karakterláncot használ egy adott karakterlánc tördelésére és tömbbe helyezésére. (String objektum eljárása.) array=str.split(/\s|;/); A pontosvesszővel vagy üres karakterrel elválasztott karakterláncokat a tömbbe helyezi.
Zárójelezett szövegrész megfeleltetése:

Egy reguláris kifejezés mintában foglalt zárójelpár hatására a megfelelő egyezésrész megjegyződik. Például, az /a(b)c/ megfelel az 'abc' karaktereknek és a 'b' megjegyződik. A megjegyzett zárójelezett szövegrész-megfeleltetések visszahívásához a RegExp objektum $1, ..., $9 tulajdonságai, vagy az Array [1], ..., [n] elemek használhatóak. A következő szkript a replace eljárást használja karakterláncban szavak cseréjéhez. A kicserélendő szöveghez a szkript a $1 és $2 tulajdonságok értékeit használja.

reg = /(\w+)\s(\w+)/; str = “Kiss Zsuzsa”; newstr = str.replace(reg, "$2, $1"); document.write(newstr);

Eredménye: "Zsusa, Kiss"

Példa űrlap használatára:

A JavaScript egyik leggyakoribb felhasználási területe az űrlapok beviteli mezőinek ellenőrzése. Ha a mezők ellenőrzése csak szerveroldalon történne, minden egyes hiba észrevételekor az űrlapot vissza kéne küldeni, ezzel feleslegesen terhelve a hálózatot, és fogyasztva az időt. A mezők helyességének ellenőrzéséhez reguláris kifejezéseket használunk. Az alábbi függvényeket a fejrészben definiáljuk, majd a Submit gomb lenyomásakor (onSubmit) meghívjuk, így az űrlap elküldése előtt még ellenőrzi a mezők tartalmát.

1. Név beviteli mező tartalmának ellenőrzése: a reguláris kifejezésből látható, hogy a név egy nemüres karaktersorozat, melyben szerepelhetnek: betű, számjegy, szóköz, aposztróf, kötőjel.

function namevalidator(strng) { error = ""; var filter= /^[\w\ '\-]+$/; if(!filter.test(strng)) { error = "Kérem adjon meg érvényes nevet!\n"; } return error; }

2. A telefonszám ellenőrzése a következőképpen zajlik: először kiszedjük az elválasztójelek mindegyikét (ezért kell a '/g' kapcsoló), majd ellenőrizzük a test függvénnyel, hogy csak számjegyek szerepelnek-e benne.

function telvalidator(strng) { error = ""; var newstrng = strng.replace( /[\(\)\.\-\ ]/g ,'' ); var filter = /^\d+$/; if(!filter.test(newstrng)) { error = "Kérem adjon meg érvényes telefonszámot!\n"; } return error; }

3. Az következő függvényben szereplő minta jelentése: 1 vagy több bármilyen karakter, majd @ jel, aztán megint 1 vagy több bármilyen karakter, egy pont és utána 2-tol 6 hosszúságú karakterlánc.

function emailvalidator(strng) { error = ""; var filter = /^.+@.+\..{2,6}$/; if(!filter.test(strng)) { error = "Kérem adjon meg érvényes e-mail címet!\n"; } return error; }

Hasznos linkek: