A reguláris kifejezés (röviden: regex) egy mintaleíró karakterlánc, amelyet szövegkereséshez, -ellenőrzéshez és -manipulációhoz használunk. Segítségével könnyedén azonosíthatunk és kezelhetünk bonyolult szövegmintákat, például fájlneveket, időpontokat vagy kódrészleteket.
A legegyszerűbb példa a ^.*$ — ez minden szövegre egyezést ad. Ha nem szükséges bonyolult átnevezést vagy szűrést végezni, ez a minta tökéletes alapbeállítás.
. – Bármilyen egyedi karaktert jelöl (kivéve az új sor karaktert).^ – A szöveg elejét jelöli.$ – A szöveg végét jelöli.[] – Karakterhalmaz, pl. [abc] megfelel az „a”, „b” vagy „c” karakternek.[^] – Negált karakterhalmaz, pl. [^0-9] minden nem számjegyre illeszkedik.| – Alternatíva, pl. A|B = „A” vagy „B”.() – Csoportosítás, a regex részeinek logikai egységbe foglalására szolgál.? – Az előtte álló elem nulla vagy egy alkalommal fordulhat elő.* – Az előtte álló elem nulla vagy több alkalommal fordulhat elő.+ – Az előtte álló elem egy vagy több alkalommal fordulhat elő.{n} – Az előtte álló elem pontosan n-szer fordul elő.{n,} – Az előtte álló elem n-szer vagy többször fordul elő.{n,m} – Az előtte álló elem legalább n-szer, legfeljebb m-szer fordul elő.\d – Bármely számjegy (0-9).\D – Nem számjegy.\w – “Szó” karakter (betű, számjegy vagy aláhúzás).\W – Nem “szó” karakter.\s – Whitespace karakter (szóköz, tab, új sor stb.).\S – Nem whitespace karakter.\ – Escape karakter. Ha speciális jelet szó szerint szeretnénk használni, pl. . a pont karakterre illeszkedik, nem tetszőleges karakterre.A néző (lookaround) kifejezések lehetővé teszik, hogy egy minta megelőző vagy követő feltételt vizsgáljunk anélkül, hogy az része lenne az egyezésnek.
(?=…) – pozitív lookahead → csak akkor egyezik, ha utána illeszkedik valami pl. \d(?=px) → olyan szám, amit „px” követ.(?!…) – negatív lookahead → csak akkor egyezik, ha utána nem illeszkedik valami pl. \d(?!px) → olyan szám, amit nem „px” követ.(?⇐…) – pozitív lookbehind → csak akkor egyezik, ha előtte illeszkedik valami pl. (?⇐#)\w+ → csak a „#” után álló szót találja meg (pl. „#title”).(?<!…) – negatív lookbehind → csak akkor egyezik, ha előtte nem illeszkedik valamiA regex viselkedése flag-ekkel módosítható (a legtöbb nyelvben azonos szintaxissal):
i – kis- és nagybetű érzéketlen keresés (case-insensitive)m – több soros mód (^ és $ minden sorra érvényes)s – pont (.) illeszthet új sorra isg – globális keresés (több találat)
Például:
/(?<id>\d+)/gi → kis/nagybetűtől függetlenül minden számot megtalál.
A (?<name>…) konstrukció elnevezett csoportot hoz létre.
Ez lehetővé teszi, hogy a feldolgozás során névvel hivatkozzunk az adott részre, ne csak sorszámmal.
Példa:
Minta:
^(?<time>\w{4})[-_](bkkinfo)[-_]*(?<date>.*)\.(?<ext>mp3|wav)$
Cél fájlnév:
bkkinfo_${time}.${ext}
Eredmény:
A 1020-bkkinfo.mp3 fájlból a rendszer bkkinfo_1020.mp3 nevet hoz létre.
Értelmezés:
^ - A fájlnév elejét jelöli. Biztosítja, hogy az illesztés a string legelején kezdődjön.(?<time>\w{4}) - Négy darab word karaktert vár (betű, szám vagy aláhúzás). Ezeket a karaktereket a time nevű csoportba menti. (A 1020-bkkinfo.mp3 esetén a time értéke 1020.)[-_] - Pontosan egy kötőjel (-) vagy aláhúzás (_). Ez választja el az időrészt a fix szövegtől.(bkkinfo) - Szó szerint a bkkinfo szöveget várja. Ez egy fix, kötelező azonosító a fájlnévben.[-_]* - Opcionálisan 0 vagy több kötőjel vagy aláhúzás. Tehát elfogadja, ha van, de ha nincs, azt is.(?<date>.*) - Bármilyen karakterláncot elfogad (akár üreset is). Az egészet a date nevű csoportba menti. Jellemzően dátum vagy egyéb kiegészítő információ. A példában 1020-bkkinfo.mp3 esetén ez üres, mert nincs köztes rész.\. - Egy literál pont. Elválasztja a fájlnevet a kiterjesztéstől. Escape szükséges, mert a pont regexben speciális karakter.(?<ext>mp3|wav) - A fájl kiterjesztése. Csak mp3 vagy wav lehet. Az értéket az ext nevű csoportba menti.$ - A fájlnév végét jelöli. Biztosítja, hogy a teljes string illeszkedjen, ne csak egy részlete.
Előfordulhat, hogy a fájlnév-mintát nem statikusan (fix dátummal / órával), hanem dinamikusan szeretnénk megadni, például „mindig a mostani idő + 30 perc” alapján. Erre van lehetőség úgy, hogy a regex szövegébe PowerShell kifejezéseket ágyazunk be, amelyeket a rendszer a minta összeállításakor kiértékel, és a kiértékelt eredmény kerül bele a tényleges regexbe. Ezzel meg lehet oldani például, hogy minden órában az aktuális fájlokat beolvassuk és ugyanazon néven elmentsük. A $( … ) részek nem a regex részei, hanem PowerShell kifejezések.
^(?<date>$((Get-Date).AddMinutes(30).ToString('yyyyMMdd')))_HIREK-(?<hour>$((Get-Date).AddMinutes(30).ToString('HH')))30\.(?<ext>.+)$
date csoportba egy konkrét yyyyMMdd formátumú dátum kerül (a futás pillanatában számolva: most + 30 perc).hour csoportba egy konkrét HH formátumú óra kerül (szintén: most + 30 perc).30 szerepel (tehát pl. 0830, 1430, stb.).ext) bármilyen értékre engedi.Részletesen:
^ - A string eleje.(?<date> … ) - Elnevezett csoport: date.$( (Get-Date).AddMinutes(30).ToString('yyyyMMdd') ) - PowerShell kifejezés, amely a futás pillanatában lekéri az aktuális időt (Get-Date), hozzáad 30 percet (.AddMinutes(30)), majd yyyyMMdd formátumú szöveggé alakítja (.ToString('yyyyMMdd')). Példa eredmény: 20260119. Ez a szöveg kerül a regexbe, tehát a date rész innentől pontosan ezt a konkrét dátumot fogja elvárni._HIREK- - Literál (fix) szöveg: aláhúzás, majd HIREK-.(?<hour> … ) - Elnevezett csoport: hour.$( (Get-Date).AddMinutes(30).ToString('HH') ) - PowerShell kifejezés, amely a futás pillanatában (most + 30 perc) az órát adja vissza HH formátumban. Példa eredmény: 08 vagy 14. Ez a szöveg kerül a regexbe, tehát a hour rész innentől pontosan ezt a konkrét órát fogja elvárni. A 30 perc hozzáadásával tudjuk elérni, hogy mondjuk az egészkor esedékes fájlt már fél órával előbb érvényesnek vegye, és feldolgozza.30 - Literál (fix) szöveg: 30. Ezzel azt kényszerítjük ki, hogy a fájlnév mindig „fél órás” időpontra illeszkedjen (pl. 0830, 1430).\. - Literál pont (a kiterjesztés elválasztója). Azért kell \., mert a . regexben speciális jelentésű.(?<ext>.+) - Elnevezett csoport: ext. .+ = legalább 1 tetszőleges karakter (gyakorlatban: kiterjesztés).$ - A string vége.
A leggyakrabban a Get-Date függvényt és annak valami módosítását használjuk, de minden szabvány PowerShell szintaxis működik. Az AddSeconds, AddMinutes, AddHours, AddDays függvények használata tipikus. Ha negatív értéket adunk meg, akkor értelemszerűen nem hozzáad, hanem kivon. Az előre gondolkodáshoz azonban pozitív értéket kell megadnunk.
Erre a legegyszerűbb példa egy óra eleji hírblokk, ami minden óra elején pár másodperccel az óraforduló után hangzik el. Ezt be szeretnénk tölteni már attól az időponttól, amikor már az előző biztosan lement. Példánkban nézzünk egy reggel nyolcas hírblokkot. 7:15-kor már biztosan lement az előző hírek, így igazából 7:15-től bármikor, ha elkészül a következő hírblokk, már beolvashatjuk. A rendszer egy olyan fájlnevet vár például, hogy 20251231_0800_HIREK.wav. Ebből a dátumot dinamikusan kell kezelnünk. A 20251231_08 karaktersort kell keresnünk, ez a Get-Date függvénnyel így néz ki:
(Get-Date).ToString('yyyyMMdd_HH')
Ha ezt lefuttatjuk, akkor 7:15-kor a kimenete az lesz, hogy 20251231_07, de nekünk már a nyolcasra végződő időpont kell, ezért hozzá kell adnunk 45 percet, így 7:15-kor már azt fogja mutatni, hogy 8 óra van, tehát a helyes kifejezés így fest:
(Get-Date).AddMinutes(45).ToString('yyyyMMdd_HH')
^\d+$ - csak számjegyekből álló teljes szöveg^[A-Za-zÁÉÍÓÖŐÚÜŰáéíóöőúüű]+$ - magyar ékezetes betűk engedélyezve^[\w.-]+@[\w.-]+.[A-Za-z]{2,}$ - egyszerű email-ellenőrzés^.*.(mp3|wav)$ - csak mp3 és wav kiterjesztésű fájlokat fogad el^\d{6}$ - pl. 240101^(0\d|1\d|2[0-3])$ - csak 00 és 23 közötti értékeket fogad el