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

Speciális karakterek

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:

  1. ^ - A fájlnév elejét jelöli. Biztosítja, hogy az illesztés a string legelején kezdődjön.
  2. (?<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.)
  3. [-_] - Pontosan egy kötőjel (-) vagy aláhúzás (_). Ez választja el az időrészt a fix szövegtől.
  4. (bkkinfo) - Szó szerint a bkkinfo szöveget várja. Ez egy fix, kötelező azonosító a fájlnévben.
  5. [-_]* - Opcionálisan 0 vagy több kötőjel vagy aláhúzás. Tehát elfogadja, ha van, de ha nincs, azt is.
  6. (?<date>.*) - Bármilyen karakterláncot elfogad (akár üreset is). Az egészet a date nevű csoportba menti.
  7. \. - Egy literál pont, ami elválasztja a fájlnevet a kiterjesztéstől.
  8. (?<ext>mp3|wav) - A fájl kiterjesztése — csak mp3 vagy wav lehet. Az értéket az ext nevű csoportba menti.
  9. $ - 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>.+)$ 

Részletesen:

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.

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:

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

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.