Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Regex tutorial — Cheatsheet by examples ====== Izvor: Jonny Fox, Medium Regularni izrazi (regex ili regexp) su izuzetno korisni u **izvlačenju informacija iz bilo kog teksta** traženjem jednog ili više podudaranja određenog obrasca pretrage (tj. određenog niza ASCII ili unikod znakova). Polja primene se kreću od provere valjanosti do raščlanjivanja/zamene stringova, prolaska kroz prevođenje podataka u druge formate i veb skrapinga. Jedna od najzanimljivijih karakteristika je da kada se nauči sintaksa, ovaj alat može da se koristi u (skoro) svim programskim jezicima (JavaScript, Java, VB, C #, C / C++, Pithon, Perl, Rubi , Delphi, R, Tcl, d mnogi drugi) sa najmanjim razlikama u pogledu podrške najnaprednijih funkcija i verzija sintakse koje podržavaju mašine. Evo nekih primerima i objašnjenja. ===== Sidra — ^ i $ ===== ''^The'' odgovara bilo kom nizu koji počinje sa **The**\\ ''end$'' odgovara nizu koji se završava sa **end** \\ ''^The end$'' tačno podudaranje niza (počinje i završava se sa **The end**) \\ ''roar'' odgovara bilo kom stringu koji ima tekst **roar** u sebi \\ ===== Kvantifikatori — * + ? i {} ===== ''abc*****'' odgovara nizu koji ima **ab** praćeno sa //nula ili više// **c** \\ ''abc+'' odgovara nizu koji ima **ab** praćeno sa //jedanim ili više// **c** \\ ''abc?'' odgovara nizu koji ima **ab** praćeno sa //nula ili jedanim// **c** \\ ''abc{2}'' odgovara nizu koji ima **ab** praćeno sa //2// **c**\\ ''abc{2,}'' odgovara nizu koji ima **ab** praćeno sa //2 ili više// **c** \\ ''abc{2,5}'' odgovara nizu koji ima **ab** praćeno sa //2 do 5// **c** \\ ''a(bc)*****'' odgovara nizu koji ima **a** praćeno sa //nula ili više kopija niza// **bc** \\ ''a(bc){2,5}****'' odgovara nizu koji ima **a** praćeno sa //2 do 5 kopija niza// **bc** \\ ===== ILI operater — | ili [] ===== ''a(b|c)'' odgovara nizu koji ima **a** praćeno sa **b** //ili// **c** \\ ''a[bc]'' isto kao i prethodni ===== Klase karaktera — d w s i . ===== ''\d'' odgovara **jedan karakter** koji je **cifra** \\ ''\w'' odgovara **znaku reči** (alfanumerički znak plus donja crta) \\ ''\s'' odgovara **razmaku** (uključuje tabulatore i prelome redova) \\ ''.'' odgovara **bilo koji karakter** \\ Pažljivo koristite operator ''.'' jer su često klasa ili negirana klasa znakova (o čemu ćemo dalje govoriti) brži i precizniji. ''\d'', ''\w'' i ''\s'' takođe predstavljaju svoje **negacije** sa ''\D'', ''\W'' i ''\S'' respektivno . \\ Na primer, ''\D'' će izvršiti obrnuto podudaranje u odnosu na ono dobijeno sa ''\d''. \\ ''\D'' odgovara **jedan necifren znak**. Da biste bili shvaćeni bukvalno, morate izbeći znakove ''^.[$()|*+?{'' **obrnutom kosom crtom** jer oni imaju posebno značenje. \\ ''$d'' odgovara nizu koji ima **$** ispred jedne cifre. Imajte na umu da možete da uparite i **znakove koji se ne mogu štampati** kao što su tabulatori ''\t'', novi redovi ''\n'', znakovi koji se vraćaju ''\r''. ==== Znak razmaka: \s ==== \s odgovara bilo kom znaku razmaka. To je ekvivalentno izlaznim sekvencama i Unicode kategorijama navedenim u sledećoj tabeli. ^Kategorija^Opis| |\f|Znak za novi obrazac (FF), \u000C.| |\n|Znak za novu liniju (LF), \u000A.| |\r|Povratni karakter (CR), \u000D.| |\t|Tab znak, \u0009.| |\v|Vertikalni tab znak, \u000B.| |\x85|Znak NEXT LINE (NEL), \u0085.| |\p{Z}|Odgovara svim znakovima za razdvajanje. Ovo uključuje kategorije Zs, Zl i Zp.| ===== Zastave ===== Učimo kako da konstruišemo regularni izraz, ali zaboravljamo osnovni koncept: **zastave**. Redovni izraz se obično nalazi u ovom obliku **/abc/**, gde je obrazac pretrage razgraničen sa dve kose crte (/). \\ Na kraju možemo navesti zastavu sa ovim vrednostima (takođe ih možemo kombinovati jedna sa drugom): ''\g'' (globalni) se ne vraća posle prvog podudaranja, ponovo pokreće sledeće pretrage od kraja prethodnog podudaranja \\ ''\m'' (višelinijski)kada je omogućeno ''^'' i ''$'' će odgovarati početku i kraju reda, umesto celog niza \\ ''\i'' (neosetljivo) čini ceo izraz neosetljivim na velika i mala slova (na primer **/aBc/i** bi odgovaralo **AbC**) \\ ====== Međuteme ====== ===== Grupisanje i hvatanje — () ===== Zagrade ''a(bc)'' stvaraju //grupu za snimanje// sa vrednošću **bc** \\ ''a(?:bc)*****'' koristeći ''?:'' onemogućavamo grupu za snimanje **bc** \\ ''a(?<foo>bc)'' koristeći ''?<foo>'' dali smo ime grupi **bc** \\ Ovaj operator je veoma koristan kada treba da izvučemo informacije iz nizova ili podataka koristeći željeni programski jezik. Svako višestruko pojavljivanje koje uhvati nekoliko grupa biće izloženo u obliku klasičnog niza: pristupićemo njihovim vrednostima specificirajući pomoću indeksa na rezultatu podudaranja. Ako odlučimo da damo ime grupama (koristeći ''(?<foo>…)''), moći ćemo da preuzmemo vrednosti grupe koristeći rezultat podudaranja kao rečnik gde će ključevi biti ime svake grupe . ===== Izrazi zagrade — [] ===== ''[abc]'' podudara se sa nizom koji ima **ili a ili b ili c** koje je **isto kao a|b|c ** \\ ''[a-c]'' isto kao i prethodni \\ ''[a-fA-F0-9]'' niz koji predstavlja **jednu heksadecimalnu cifru, bez obzira na velika i mala slova** \\ ''[0-9]%'' niz koji ima karakter **od 0 do 9 pre znaka %** \\ ''[^a-zA-Z]'' niz koji nema slovo od a do z ili od A do Z. U ovom slučaju se ''^'' koristi kao **negacija izraza** \\ \\ Imajte na umu da svi posebni znakovi unutar izraza u zagradama (uključujući obrnutu kosu crtu) gube svoja posebna ovlašćenja: stoga nećemo primeniti „pravilo bežanja“. ===== Pohlepni i lenji se poklapaju ===== Kvantifikatori ( ''* + {}'') su *pohlepni operatori*, tako da proširuju podudaranje koliko god mogu kroz dati tekst. Na primer, ''<.+>'' odgovara ''<nowiki><div>simple div</div></nowiki>'' u ''This is a <nowiki><div>simple div</div></nowiki>'' test. Da bismo uhvatili samo oznaku ''div'', možemo koristiti ''?'' da je učinimo lenjim \\ ''<.+?>'' podudara se sa bilo kojim znakom **jedan ili više** puta uključenim unutar ''<'' i ''>'', **proširujući po potrebi**. \\ Primetite da bi bolje rešenje trebalo da izbegava upotrebu ''.'' u korist strožijeg redovnog izraza: ''<[^<>]+>'' odgovara bilo kom znaku osim ''<'' ili ''>'' jednom ili više puta uključenim unutar ''<'' i ''>''. ---- ====== Napredne teme ====== ===== Granice — b i B ===== ''\babc\b'' vrši **"samo cele reči"** pretragu \\ \\ ''\b'' predstavlja **sidro kao karet** (slično je kao ''$'' i ''^'') odgovarajućim pozicijama gde je **jedna strana** karakter reči (kao ''\ v''), a **druga strana** nije karakter reči (na primer, može biti početak stringa ili razmak). Dolazi sa svojom **negacijom**, ''\B''. Ovo se poklapa sa svim pozicijama na kojima se ''\b'' ne podudara i može biti ako želimo da pronađemo obrazac pretrage u potpunosti okružen znakovima reči. ''\Babc\B'' se podudara samo ako je obrazac **potpuno okružen** znakovima reči. ===== Povratne reference — 1 ===== ''([abc])\1'' koristeći ''\1'' odgovara **istom** tekstu koji je upario **prva grupa za snimanje**. \\ ''([abc])([de])\2\1'' možemo da koristimo ''\2'' (3, 4, itd.) da identifikujemo **isti** tekst koji je **podudarala druga** (treća, četvrta, itd.) grupa za snimanje. \\ ''(?<foo>[abc])\k<foo>'' grupi stavljamo ime ''foo'' i referenciramo ga kasnije (''k<foo>''). Rezultat je isti kao prvi regularni izraz. ===== Pogled napred i pogled iza — (?=) i (?<=) ===== ''d(?=r)'' odgovara „d“ samo ako ga **prati r**, ali „r“ neće biti deo ukupnog podudaranja regularnog izraza. \\ ''(?<=r)d'' odgovara „d“ samo ako mu **prethodi r**, ali r neće biti deo ukupnog podudaranja regularnog izraza. \\ Možete koristiti i operator negacije! ''d(?!r)'' odgovara „d“ samo ako **ne prati r**, ali r neće biti deo ukupnog podudaranja regularnog izraza. \\ ''(?<!r)d'' odgovara „d“ samo ako mu **ne prethodi r**, ali r neće biti deo ukupnog podudaranja regularnog izraza. CKG Edit kb/zapisi/regex_main.txt Last modified: 2023/08/16 09:11by milano