Feladat: Írjunk olyan regex kifejezést, amely illeszkedik a következő sorokra: 1999.11.11 1981-11-03 2007.01.05 2006.12.1 de nem illeszkedik a következőkre: 2002/10.1 3000.2.1 2003.02.33 2001.13.2 Egy lehetséges megoldás a következő: (19|20)\d\d([-/.])(0?[1-9]|1[012])\2(0?[1-9]|[12][0-9]|3[01])\b Indoklás: (19|20) Vagy 19-cel, vagy 20-szal kezdődik \d Tetszőleges számjegy. \d Tetszőleges számjegy. ([-/.]) Kötőjel, per vagy pont. A zárójel hatására megjegyeztetjük azt a szövegrészt (jelen esetben ez csak 1 karakter), amely illeszkedett. (0?[1-9]|1[012]) A zárójelen belül | által elzárt részek valamelyike egyezik (ebben a sorrendben próbál illeszteni is). A ? hatása: az elző karakter (vagy zárójellel jelölt blokk) nem illeszkedik, vagy egyszer illeszkedik. \2 A második zárójel által jelölt részt ismételjük meg megint. Emiatt nem fog illeszkedni a következő kifejezés: 2002/10.1 (0?[1-9]|[12][0-9]|3[01]) Nap. \b Szóhatár. Enélkül 2003.02.33 illeszkedne, hiszen 2003.02.3 illeszkedne, és nem foglalkozna a következő 3-assal. Ez 0 szélességű illeszkedés. Példa lebegőpontos számokra történő illeszkedésre: [-+]?[0-9]*\.?[0-9]+ Keressük meg az összes html parancsot a www.google.com forráskódjában: <.*?> Lusta kiértékeléssel kérünk tetszőleges sok karaktert, majd egy > jelet. <[^>]*> Megkérjük, hogy keresse meg a maximális hosszúságú illeszkedést úgy, hogy nem illeszkedhet a > jelre. Ez után illeszkednie kell egy > jelre. Az előző két eset nem adja ugyanazt a megoldást minden esetben, mivel opció kérdése, hogy a . illeszkedjen-e az újsor karakterre. Linux-os parancsok, amelyeknél használunk regex-et: Ezen parancsok leírása (amelyet nem igazán kezdő linux-osoknak találtak ki): man parancsnév Majd le-fel nyilakkal lehet navigálni, q-val pedig kilépni. cat filenév A fájl tartalmának kiíratása. cat *.tex Az összes adott könyvtárban lévő tex fájl kiíratása A következő sor kiírja az adott könyvtárban lévő összes tex fájlban található section és subsection címet: egrep 'kifejezés' fájl1 fálj2 A felsorolt fájlokban keres az adott kifejezés után. A kifejezést azért tesszük idézőjel közé, hogy használhassunk space-t is a kifejezésben annélkül, hogy fáljnévnek nézné. egrep -o 'kifejezés' *.tex Ugyanaz, de nem az egész sort írja ki, amely tartalmazott találtatot, hanem csak a találatot. egrep -o 'kifejezés' Ugyanaz, mint az előző, de a standard bemenetről (esetünkben billentyűzetről) várja az adatot. sed -r 's/MIT/MIRE/OPCIOK' Kicseréli a bemeneten kapott szövegben azon részeket, amelyekre illeszkedik MIT, és kicseréli MIRE. A legtipikusabb opció g, amely hatására az összes cserét elvégzi, nem csak a legelsőt. A | jel segítségével írányíthatjuk egy parancs kimenetét egy másik parancs bemenetére. A következő sor kiírja az adott könyvtárban lévő összes tex fájlban található section és subsection címet: cat *.tex | egrep -o 'section{[^}]*}' | sed -r 's/section\{([^}]*)\}/\1/g' Akinek megtetszett az ebben rejlő lehetőség, annak ajánlom a find ls df parancsokat, ezek kimenetét "élvezet" egrep-pel és sed-del feldolgozni. További példák találhatók itt: http://progkor.inf.elte.hu/regkif.htm