omotam img

Ugrás a tartalomra
  1. Posts/

Regex tanulás egyszerű módon

··2358 szó·12 perc·

Learn Regex

Mi az a reguláris kifejezés? #

A reguláris kifejezés karakterek vagy szimbólumok egy csoportja, amelyet egy szövegből adott minták megtalálására használnak.

A reguláris kifejezés egy olyan minta, amely illeszkedik egy adott karakterláncra balról jobbra. Magát a “Regular expression” kifejezést általában rövidítve lehet megtalálni, mint “regex” vagy “regexp”. A reguláris kifejezést használják szövegrészek lecserélésére egy szövegben, űrlapok validálására, szövegrészek kiválasztására mintaegyezés alapján egy hosszabb szövegből és így tovább.

Képzeld el, hogy egy alkalmazást írsz és szeretnél szabályokat állítani a felhasználónév kiválasztásához. A felhasználónév csak betűket, számokat, aláhúzásjelet és kötőjelet tartalmazhat. Szeretnénk limitálni a karakterek maximális számát is a felhasználónévben, hogy ne legyen csúnya. A felhasználónév validálására a következő reguláris kifejezést használjuk:

Regular expression

A feljebbi reguláris kifejezés elfogadja a john_doe, jo-hn_doe és a john12_as karakterláncokat. Nem fog egyezni a Jo-ra mert ez nagybetűt tartalmaz és túl rövid is.

1. Bevezetés #

A reguláris kifejezés egy karakterminta, amit keresésre használunk egy szövegben. Például a the reguláris kifejezés a következőt jelenti: egy t betű, amit h követ, amit egy e követ.

"the" =\> The fat cat sat on the mat.

Teszteld a reguláris kifejezést

Az 123 reguláris kifejezés illeszkedik a 123 karakterláncra. A reguláris kifejezés minden egyes karaktere össze lesz hasonlítva a bevitt karakterlánc minden elemével egymás után. A reguláris kifejezések alap esetben kis-nagybetű érzékenyek, tehát a The reguláris kifejezés nem fog illeszkedni a the karakterláncra.

"The" =\> The fat cat sat on the mat.

Teszteld a reguláris kifejezést

2. Meta karakterek #

A meta karakterek a reguláris kifejezések építőkockái. A meta karakterek speciális módon értelmezendőek. Némelyik meta karakternek speciális jelentése van és szögletes zárójelek közé vannak téve. A meta karakterek a következők:

Meta karakterLeírás
.A pont illeszkedik minden egyes karakterre kivéve a sortörést.
[ ]Karakter osztály. Minden karakterre illeszkedik ami a szögletes zárójelek közt van.
[^ ]Negált karakter osztály. Minden karakterre illeszkedik ami nincs a szögletes zárójelek közt.
*Illeszkedik az őt megelőző szimbólum 0 vagy több ismétlődésére.
+Illeszkedik az őt megelőző szimbólum 1 vagy több ismétlődésére.
?Opcionálissá teszi az őt megelőző szimbólumot.
{n,m}Kapcsos zárójelek. Illeszkedik az őt megelőző szimbólum minimum “n” de nem több mint “m” ismétlődésére.
(xyz)Karakter csoport. Illeszkedik az xyz karakterekre pontosan ilyen sorrendben.
|Alternáció. Illeszkedik a szimbólum előtt és után álló karakterekre is.
\Escape-li a következő karaktert. A segítségével lefoglalt karakterekre is lehet illeszkedni [ ] ( ) { } . * + ? ^ $ \ |
^A karakterlánc elejére illeszkedik.
$A karakterlánc végére illeszkedik.

2.1 Full stop #

A full stop . a legegyszerűbb meta karakter példa. A . meta karakter illeszkedik minden egyes karakterre. Nem fog illeszkedni a kocsi vissza és a sortörés karakterekre. Például a .ar reguláris kifejezés jelentése: minden karakter, amit a aztán r követ.

".ar" =\> The car parked in the garage.

Teszteld a reguláris kifejezést

2.2 Karakter osztályok #

A szögletes zárójelekkel határozzuk meg a karakter osztályokat. A szögletes zárójelek közt kötőjel karakterrel határozhatunk meg karakter tartományokat. A karaktertartomány sorrendje nem számít. Például a [Tt]he reguláris kifejezés jelentése: nagybetűs T vagy kisbetűs t amit egy h majd egy e betű követ.

"[Tt]he" =\> The car parked in the garage.

Teszteld a reguláris kifejezést

Egy pont a karakter osztályon belül egyébként szó szerint pont-ot jelent. A ar[.] reguláris kifejezés jelentése: kisbetűs a amit egy r aztán egy pont . karakter követ.

"ar[.]" =\> A garage is a good place to park a car.

Teszteld a reguláris kifejezést

2.2.1 Negált karakter osztályok #

Általában a kalap szimbólum egy karakterlánc elejét jelenti, de ha egy nyitó szögletes zárójel után áll, akkor negálja a karakter osztályt. Például a [^c]ar reguláris kifejezés jelentése: minden karakter a c kivételével ami után a aztán egy r betű áll.

"[^c]ar" =\> The car parked in the garage.

Teszteld a reguláris kifejezést

2.3 Ismétlések #

A következő meta karaktereket +, * vagy ? arra használjuk, hogy meghatározzuk, hányszor fordulhat elő az al-minta. Ezek a meta karakterek máshogy viselkednek adott helyzetekben.

2.3.1 A csillag #

A * szimbólum az őt megelőző karakter nulla vagy több ismétlődésére illeszkedik. A a* reguláris kifejezés jelentése: nulla vagy több ismétlődése az őt megelőző a karakternek. De ha egy karakter osztály után áll akkor az egész karakterosztály ismétlődését keresi. Például, a [a-z]* reguláris kifejezés jelentése: bármennyi kisbetűs betű egy sorban.

"[a-z]*" => The car parked in the garage #21.

Teszteld a reguláris kifejezést

A * szimbólum használható a . meta karakterrel .*, ez illeszkedik bármilyen karakterláncra. A * szimbólum használható a whitespace karakterrel \s együtt, hogy illeszkedjen egy whitespace-ekből álló karakterláncra. Például a \s*cat\s*kifejezés jelentése: nulla vagy több szóköz, amit egy kisbetűs c, aztán egy kisbetűs a, aztán egy kisbetűs t, amit még nulla vagy több szóköz követ.

"\s*cat\s*" =\> The fat cat sat on the concatenation.

Teszteld a reguláris kifejezést

2.3.2 A plusz #

A + szimbólum illeszkedik az őt megelőző karakter egy vagy több ismétlődésére. Például a c.+t kifejezés jelentése: kisbetűs c betű, amit legalább egy vagy több t követ. Itt tisztázni kell hogy a t az utolsó t a mondatban.

"c.+t" =\> The fat cat sat on the mat.

Teszteld a reguláris kifejezést

2.3.3 A kérdőjel #

A reguláris kifejezésben a ? meta karakter opcionálissá teszi az őt megelőző karaktert. Ez a szimbólum az őt megelőző karakter nulla vagy egy példányára illeszkedik. Például a [T]?he kifejezés jelentése: opcionális a nagybetűs T, amit egy kisbetűs h, majd egy kisbetűs e követ.

"[T]he" => The car is parked in the garage.

Teszteld a reguláris kifejezést

"[T]?he" => The car is parked in the garage.

Teszteld a reguláris kifejezést

2.4 A kapcsos zárójelek #

A reguláris kifejezésben a kapcsos zárójeleket annak meghatározására használjuk, hogy egy karakter vagy egy karakter csoport hányszor ismétlődhet. Például a [0-9]{2,3} kifejezés jelentése: minimum 2 de nem több mint 3 karakter a [0-9] karaktertartományon belül.

"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.

Teszteld a reguláris kifejezést

Kihagyhatjuk a második számot. Például a [0-9]{2,} kifejezés jelentése: 2 vagy több számra illeszkedik. Ha a vesszőt is kitöröljük [0-9]{3}: Pontosan 3 számra illeszkedik.

"[0-9]\{2,\}" =\> The number was 9.9997 but we rounded it off to 10.0.

Teszteld a reguláris kifejezést

"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.

Teszteld a reguláris kifejezést

2.5 Karakter csoportok #

A karakter csoport al-minták csoportja amik zárójelek közé (...) vannak írva. Ahogy előbb már megbeszéltük, ha egy karakter után ismétlő karaktert rakunk, az ismételni fogja az előtte lévő karaktert. De ha egy ismétlő karaktert egy karakter csoport után rakunk, az ismételni fogja az egész csoportot. Például a (ab)* kifejezés illeszkedik nulla vagy több ismétlődésére az ab karaktereknek. Használhatunk alternáló meta karaktert | is a csoporton belül. Például a (c|g|p)ar kifejezés jelentése: kisbetűs c, g vagy p karakter, amit egy a aztán egy r karakter követ.

"(c|g|p)ar" => The car is parked in the garage.

Teszteld a reguláris kifejezést

2.6 Alternálás #

A reguláris kifejezésben a függőleges vonalat | alternálásra (választásra) használjuk. Az alternálás olyan, mint egy feltétel több kifejezés közt. Most azt gondolhatod, hogy a karakter osztály és az alternáció ugyan úgy működik. De a fő különbség köztük, hogy a karakter osztály a karakterek szintjén működik, az alternáció viszont a kifejezés szintjén. Például a (T|t)he|car kifejezés jelentése: nagybetűs T karakter vagy kisbetűs t karakter, amit egy h és egy e követ, VAGY kisbetűs c aztán a aztán r karakter.

"(T|t)he|car" => The car is parked in the garage.

Teszteld a reguláris kifejezést

2.7 Speciális karakter escape-elése #

A visszaper \ a reguláris kifejezésekben a következő karakter escape-elésére való. Ez enged nekünk szimbólumokat vagy lefoglalt karaktereket { } [ ] / \ + * . $ ^ | ? megadni. Egy speciális karakter egyező karakterként való megadásához tedd elé a \ karaktert.

Például a . kifejezést az összes karakter, kivéve a sortörés illeszkedéséhez használjuk. A (f|c|m)at\.? kifejezés jelentése: kisbetűs f, c vagy m, amit egy kisbetűs a aztán egy kisbetűs t, amit egy opcionális . karakter követ.

"(f|c|m)at\.?" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

2.8 Horgonyok #

A reguláris kifejezésekben horgonyokat használunk, hogy megnézzük, az illeszkedő szimbólum a kezdő vagy a záró szimbóluma-e a karakterláncnak. A horgonyoknak két fajtájuk van: Az első a Kalap ^, ami megnézi, hogy az egyező karakter a karakterlánc kezdő kerektere-e és a második a Dollár $, ami azt vizsgálja, hogy az egyező karakter a karakterlánc utolsó karaktere-e.

2.8.1 Kalap #

A kalap ^ szimbólumot arra használjuk, hogy megnézzük, hogy az egyező karakter a karakterlánc kezdő kerektere-e. Ha megadjuk a következő kifejezést: ^a, akkor illeszkedik a abc karakterlánc a karakterére, mert az za első. De ha megadjuk, hogy: ^b, ez nem fog illeszkedni az abc egyik részére sem, mert nem b a kezdő karakter. Nézzünk meg egy másik kifejezést. ^(T|t)he jelentése: nagybetűs T vagy kisbetűs t a kezdő karaktere a karakterláncnak, amit kisbetűs h, majd kisbetűs e követ.

"(T|t)he" => The car is parked in the garage.

Teszteld a reguláris kifejezést

"^(T|t)he" => The car is parked in the garage.

Teszteld a reguláris kifejezést

2.8.2 Dollár #

A dollár $ szimbólumot arra használjuk, hogy megnézzük, hogy az egyező karakter a karakterlánc utolsó karaktere-e. Például a (at\.)$ kifejezés jelentése: egy kisbetűs a, amit egy kisbetűs t, amit egy . követ. És ennek az egésznek a karakterlánc végén kell lennie.

"(at\.)" => The fat cat. sat. on the mat.

Teszteld a reguláris kifejezést

"(at\.)$" => The fat cat. sat. on the mat.

Teszteld a reguláris kifejezést

3. Shorthand Karakter osztályok #

A gyakran használt karakter osztályokra a reguláris kifejezésnek vannak rövidítései, amikkel kényelmesebben tudunk használni általános kifejezéseket. A shorthand karakter osztályok a következők:

RövidítésLeírás
.Minden karakter a sortörésen kívül.
\wAz alfanumerikus karakterekre illeszkedik: [a-zA-Z0-9_]
\WA nem alfanumerikus karakterekre illeszkedik: [^\w]
\dSzámra illeszkedik: [0-9]
\DNem számra illeszkedik: [^\d]
\sWhitespace karakterre illeszkedik: [\t\n\f\r\p{Z}]
\SNem whitespace karakterre illeszkedik: [^\s]

4. Lookaround #

A lookbehind (hátranézés) és a lookahead (előrenézés) speciális típusai a nem tárolt csoport oknak, amiket illeszkedésre használnak, de nincsenek benne az illeszkedési listában. Az előrenézést akkor használjuk, ha feltételezzük, hogy ezt a mintát egy másik minta előzi meg, vagy követi. Például kell nekünk az összes szám ami előtt $ karakter áll a következő karakterláncból: $4.44 and $10.88. Ezt a mintát fogjuk használni: (?<=\$)[0-9\.]*, aminek a jelentése: Szedd ki az összes számot ami . karaktert tartalmaz és megelőzi egy $ karakter. A következő lookaround-okat használhatjuk:

SzimbólumLeírás
?=Positive Lookahead
?!Negative Lookahead
?<=Positive Lookbehind
?<!Negative Lookbehind

4.1 Positive Lookahead #

A pozitív előrenézés azt mondja, hogy a kifejezés első részét az előrenézés kifejezésnek kell követnie. Az illeszkedés csak azt a szöveget tartalmazza, amire a kifejezés első része illeszkedett. Pozitív előrenézést zárójelekkel definiálunk. A zárójelek közt van a kérdőjel egy egyenlőségjellel, így: (?=...). Az előrenézés kifejezést az egyenlőségjel után írjuk a zárójelek közé. Például a (T|t)he(?=\sfat) jelentése: opcionális kisbetűs t vagy nagybetűs T, amit egy h aztán egy e követ. A zárójelek közt definiáljuk a pozitív előrenézést ami megmondja a reguláris kifejezés motornak, hogy illeszkedjen a The vagy the karakterláncokra, amelyeket a fat karakterlánc követ.

"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

4.2 Negative Lookahead #

A negatív előrenézést akkor használjuk, ha az olyan illeszkedések kellenek, amelyeket nem követ egy bizonyos minta. A negatív előrenézést ugyanúgy definiáljuk mint a pozitív előrenézést, az egyetlen különbség, hogy az egyenlőségjel = helyett negálást ! használunk: (?!...). Nézzük meg a következő kifejezést: (T|t)he(?!\sfat), jelentése: szedd ki az összes The vagy the szót, amelyeket nem követ a fat szó (amit még megelőz egy szóköz).

"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

4.3 Positive Lookbehind #

A pozitív hátranézést akkor használjuk, ha kell az összes illeszkedés, amit egy megadott minta előz meg. A pozitív hátranézés így van jelölve: (?<=...). A (?<=(T|t)he\s)(fat|mat) jelentése: szedd ki az összes fat vagy mat szót amelyek a The vagy a the szavak után vannak.

"(?\<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

4.4 Negative Lookbehind #

A negatív hátranézést akkor használjuk, ha kell az összes illeszkedés, amit nem egy megadott minta előz meg. Jelölése: (?<!...). Például a (?<!(T|t)he\s)(cat) kifejezés jelentése: szedd ki az összes olyan cat szót, amelyik nem a The vagy a the szavak után van.

"(?<!(T|t)he\s)(cat)" => The cat sat on cat.

Teszteld a reguláris kifejezést

5. Flag-ek #

A flag-eket módosítónak hívják, mert módosítják a reguláris kifejezés kimenetét. Ezeket a flag-eket bármilyen sorban vagy kombinációban lehet használni, a RegExp szerves részét képezik.

FlagLeírás
iKis-nagybetű érzéketlen: Beállítja, hogy az illeszkedés kis-nagybetű érzéketlen legyen.
gGlobális keresés: A bemeneti szövegben mindenütt keresi az illeszkedéseket.
mTöbbsoros: A horgonyok az összes sorra működnek.

5.1 Kis-nagybetű érzéketlen #

Az i módosító beállítja, hogy az illeszkedés ne legyen kis-nagybetű érzékeny. Például a /The/gi kifejezés jelentése: nagybetűs T amit kisbetűs h, majd e követ. A kifejezés végén az i megmondja a reguláris kifejezés motornak, hogy hagyja figyelmen kívül a betűk méretét. Ahogy látod, megadtuk a g flag-et, mert az egész bemeneti szövegben akarjuk keresni az illeszkedéseket.

"The" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

"/The/gi" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

5.2 Globális keresés #

A g módosítót arra használjuk, hogy globálisan keressünk illeszkedéseket. (Megkeresi az összes előfordulást, nem áll meg az első egyezés után). Például a /.(at)/g kifejezés jelentése: minden karakter, kivéve a sortörést, amelyet a és t követ. Mivel megadtuk a g flag-et, az összes ilyenre fog illeszkedni, nem csak az elsőre (ami az alapértelmezett viselkedés).

"/.(at)/" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

"/.(at)/g" => The fat cat sat on the mat.

Teszteld a reguláris kifejezést

5.3 Többsoros #

Az m módosítót a többsoros illeszkedésekhez használjuk. Ahogy előzőleg beszéltük, a horgonyokat (^, $) arra használjuk, hogy megnézzük, a minta az eleje, vagy a vége-e a vizsgált karakterláncnak. De ha azt szeretnénk, hogy a horgonyok az összes soron működjenek, használjuk az m módosítót. Például a /at(.)?$/gm kifejezés jelentése: kisbetűs a karakter, amit egy kisbetűs t követ, amit opcionálisan bármi követhet, kivéve sortörés. És az m flag miatt a reguláris kifejezés motor az összes sor végéig keres illeszkedést.

"/.at(.)?$/" => The fat
                cat sat
                on the mat.

Teszteld a reguláris kifejezést

"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

Teszteld a reguláris kifejezést

Hozzájárulás #

  • Jelents hibákat
  • Nyiss pull request-eket fejlesztésekkel
  • Hírdesd az igét
  • Érj el közvetlenül itt: Twitter URL

Licenc #

MIT © Zeeshan Ahmad