Regex – Reguláris kifejezések
A reguláris kifejezés (röviden: regex) egy rövid, szöveges minta, amivel meg tudjuk mondani a rendszernek, hogy “milyen nevű fájlokat keresek” vagy “hogyan alakítsam át ezt a szöveget”. A BroAdminben szinte minden olyan helyen találkozol vele, ahol fájlokat kell azonosítani vagy átnevezni — pl. a Loader, a Syncer, a Remote vagy a Purger Minta mezőjében.
Első ránézésre ijesztőnek tűnhet, de a leggyakoribb esetekhez elég néhány alapszabályt megjegyezni — ehhez nyújt segítséget ez az oldal.
Ha csak annyit szeretnél, hogy minden fájl illeszkedjen (ne szűrjön semmit), a legegyszerűbb minta a ^.*$ — ez minden szövegre egyezést ad. Bonyolult szűrés vagy átnevezés nélkül ez egy tökéletes alapbeállítás.
Alapok
.– 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ő.
Speciális karakterek
\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 egy speciális jelet szó szerint szeretnénk használni (pl. a pontot, ami alapból “bármilyen karakter”-t jelent), elé kell tenni egy backslash-t:\.már szó szerint a pont karakterre illeszkedik.
Csoportok és elnevezett csoportok
A zárójelek () nemcsak csoportosítanak, hanem a bennük lévő találatot is elmentik, amit később fel lehet használni — pl. egy fájl átnevezésénél. Ha névvel akarunk hivatkozni egy csoportra (nem csak sorszámmal), a (?<name>…) szintaxist használjuk.
Példa — egy fájl neve alapján állítjuk elő az új nevét:
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.
Lépésről lépésre:
^- 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. (A1020-bkkinfo.mp3esetén atimeé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.\.- Egy literál pont, ami elválasztja a fájlnevet a kiterjesztéstől.(?<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.
Minél több elnevezett csoportot ((?<name>…)) használsz a Mintában, annál kényelmesebben tudod összeállítani az új fájlnevet a Fájlnév mezőben, ${name} formában hivatkozva rá — így nem kell fejben tartani a csoportok sorszámát.
Dinamikus minták
Előfordulhat, hogy a fájlnév-mintát nem statikusan (fix dátummal / órával), hanem dinamikusan szeretnénk megadni — pl. “mindig a mostani idő + 30 perc” alapján. Erre van lehetőség: a minta szövegébe PowerShell kifejezéseket ágyazhatunk be, amiket a rendszer a minta összeállításakor kiértékel, és a kiértékelt eredmény kerül a tényleges regexbe. A $( … ) részek tehát 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>.+)$
- A
datecsoportba egy konkrétyyyyMMddformátumú dátum kerül (a futás pillanatában számolva: most + 30 perc). - A
hourcsoportba egy konkrétHHformátumú óra kerül (szintén: most + 30 perc). - A fájlnévben az óra után fixen
30szerepel (tehát pl. 0830, 1430, stb.). - A kiterjesztést (
ext) bármilyen értékre engedi.
Részletesen:
^- A string eleje.(?<date> … )- Elnevezett csoport:date.$( (Get-Date).AddMinutes(30).ToString('yyyyMMdd') )- PowerShell kifejezés: lekéri az aktuális időt, hozzáad 30 percet, majdyyyyMMddformátumú szöveggé alakítja. Példa eredmény:20260119. Ez a szöveg kerül a regexbe, tehát adaterész innentől pontosan ezt a konkrét dátumot fogja elvárni._HIREK-- Literál (fix) szöveg.(?<hour> … )- Elnevezett csoport:hour.$( (Get-Date).AddMinutes(30).ToString('HH') )- Ugyanez az elv, csak órára: eredménye08vagy14. A 30 perces eltolással érjük el, hogy az egészkor esedékes fájlt már fél órával korábban érvényesnek vegye és feldolgozza.30- Literál szöveg, ami kikényszeríti, 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).(?<ext>.+)- Elnevezett csoport: legalább 1 tetszőleges karakter (gyakorlatban: kiterjesztés).$- A string vége.
A leggyakrabban a Get-Date függvényt és annak módosítóit használjuk (AddSeconds, AddMinutes, AddHours, AddDays), de minden szabvány PowerShell szintaxis működik. Negatív érték esetén a rendszer kivon, nem hozzáad. Az “előre gondolkodáshoz” (pl. hogy egy fájlt már a tényleges időpont előtt keressünk) pozitív értéket adunk meg.
Gyakorlati példa — reggel nyolcas hírblokk: A rendszer egy 20251231_0800_HIREK.wav formátumú fájlnevet vár. 7:15-kor már biztosan lement az előző hírblokk, tehát ettől a pillanattól kezdve bármikor beolvashatjuk az újat, amint elkészül. Ehhez a 20251231_08 részt kell felismernünk — ezt egyszerű Get-Date-tel így fejezhetjük ki:
(Get-Date).ToString('yyyyMMdd_HH')
Ha ezt lefuttatjuk, 7:15-kor a kimenete 20251231_07 lenne — de nekünk már a nyolcasra végződő fájl kell. Ezért hozzáadunk 45 percet, így 7:15-kor a kifejezés már 8 órát fog mutatni:
(Get-Date).AddMinutes(45).ToString('yyyyMMdd_HH')
Több kész, gyakorlatban bevált dinamikus minta (fél órás/egész órás hírblokk, napi műsor, több adóra szétosztott feldolgozás) megtalálható a Loader dokumentációjában.
Lookahead és lookbehind (haladóknak)
Ezekre ritkán van szükség, de jó tudni, hogy léteznek: 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 a tényleges 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 valami.
Jelölők (flag-ek)
A regex viselkedése jelölőkkel (flag) is módosítható — ezekkel gyakran találkozhatsz online regex-tesztelőkben vagy programozási nyelvekben, jellemzően /minta/gi formában:
i– kis- és nagybetű érzéketlen keresés (case-insensitive)m– több soros mód (^és$minden sorra érvényes)s– a pont (.) illeszthet új sorra isg– globális keresés (több találat)
A BroAdmin Minta mezőibe csak magát a mintát kell beírni, perjelek és jelölők nélkül — tehát ^.*\.wav$, nem /^.*\.wav$/i. Ha egy külső regex-tesztelő oldalon próbálod ki a mintát, onnan csak a perjelek közötti részt (a jelölők nélkül) másold be a BroAdmin mezőjébe.
Gyakori, kész minták
- Csak számok:
^\d+$- csak számjegyekből álló teljes szöveg - Csak betűk:
^[A-Za-zÁÉÍÓÖŐÚÜŰáéíóöőúüű]+$- magyar ékezetes betűk engedélyezve - E-mail cím:
^[\w.-]+@[\w.-]+\.[A-Za-z]{2,}$- egyszerű email-ellenőrzés - Fájlkiterjesztés:
^.*\.(mp3|wav)$- csak mp3 és wav kiterjesztésű fájlokat fogad el - Dátum (ééhhnn):
^\d{6}$- pl. 240101 - Óra (00–23):
^(0\d|1\d|2[0-3])$- csak 00 és 23 közötti értékeket fogad el
Mintákat legkényelmesebben a regex101 oldalon lehet összerakni és kipróbálni: rögtön látod, mire illeszkedik a mintád, és csoportonként is kiszínezi a találatot. Ha végleges vagy, csak a mintát magát (perjelek és jelölők nélkül) másold be a BroAdmin megfelelő mezőjébe.
Ha elakadsz, egy AI chat asszisztens (pl. ChatGPT) is pillanatok alatt generál regex mintát, ha megadod neki a kívánt fájlnévsémát, és hogy mit szeretnél kiemelni belőle. A PowerShell kifejezéseket egyszerűen egy PowerShell ablakban, idézőjelek között tudod tesztelni.
