Džoker znaci u regularnim izrazima
Džoker znaci u regularnim izrazima su posebne oznake koje se odnose na svaki znak iz neke grupe znakova. Većina njih u stvari predstavljaju skraćeni način pisanja neke klase znakova koju bismo inače stalno koristili.
Hajde da vidimo na šta se to u stvari odnosi:
Univerzalni džoker znaci | ||
---|---|---|
. | Tačka je najopštiji džoker - odnosi se na bilo koji znak. | |
\d | [0-9] | Označava bilo koju cifru. |
\D | [^\d] [^0-9] |
Negacija \d znaka, tj. označava svaki znak koji nije cifra. |
\w | [a-zA-Z0-9_] | Označava svaki alfanumerički znak. U stvari ovo su slova engleske abecede, cifre i donja crta. |
\W | [^\w] [^a-zA-Z0-9_] |
Negacija \w znaka, dakle bilo koji znak koji nije alfanumerik. |
\s | [ \t\n\r\f\v] | Predstavlja razmak ili bolje reći nevidljiv (non-printable) znak, poput space, tabulatora, entera... |
\S | [^\s] [^ \t\n\r\f\v] |
Negacija \s znaka, tj. svaki znak koji ne spada u non-printable znakove. |
Džoker znaci koji ne funkcionišu u JavaScriptu | ||
\l | [a-zčćđšž] | Označava bilo koje malo slovo. |
\L | [^\l] [^a-zčćđšž] |
Negacija \l znaka, tj. svaki znak koji nije malo slovo. |
\u | [A-ZČĆĐŠŽ] | Označava bilo koje veliko slovo. |
\U | [^\u] [^A-ZČĆĐŠŽ] |
Negacija \u znaka, tj. svaki znak koji nije veliko slovo. |
\C | . | označava bilo koji znak - isto kao kada koristimo tačku. |
U ovom tekstu ćemo se baviti samo univerzalnim džoker znacima, za koje znamo da funkcionišu u JavaScriptu.
Nemojte uvek "slepo verovati" objašnjenju koje pročitate. Uvek proverite da li se neki džoker znak odnosi i na naša latinična i ćirilična slova. Tako ispada da naša slova ne budu znakovi koji spadaju u alfanumerike.
Najpre da vidimo jedan mali primer u kome koristimo osnovni džoker - tačku. Ovaj džoker se odnosi na bilo koji znak. Ipak, ni on nije svemoćan - ne pokriva entere, odnosno znak za prelazak u novi red \n.
Bilo koji znak | a.a | gi | Ana je znala da je Aca namazao dva parčeta hleba. | Ovde bukvano kažemo - pronađi svaku pojavu dva slova a između kojih se nalazi bilo koji znak. |
Inače, svaki džoker znak (osim tačke) se može zadati unutar klase znakova, odnosno možemo ga ubaciti unutar srednjih zagrada zajedno sa još nekim znakovima i tako mu "dopuniti" značenje. U narednim primerima ćemo isprobati kako sve ovo funkcioniše. Slobodno menjajte šablone i tekstove kako biste isprobali ponašanje raznih varijanti regularnog izraza.
Zbog lakoće korišćenja, džoker znak tačka nas može lako odvesti na pogrešan put. Tako da i rezultati mogu biti neočekivani ili pogrešni. Ponekad je bolje koristiti negaciju klase, nešto što bi odgovaralo "nađi sve znakove osim...".
Tekst unutar navodnika | ".*" | g | Neko je rekao "Ko ide", a mi smo odgovorili - "Ne pucaj, naši smo". | Ovde pokušavamo da izdvojimo tekst unutar navodnika, ali pogledajte šta biva selektovano zbog "pohlepnog" kvantifikatora *. U ovom slučaju se pravimo da ne znamo lenjo uparivanje odnosno kvantifikator *?. |
Tekst unutar navodnika | "[^"]*" | g | Neko je rekao "Ko ide", a mi smo odgovorili - "Ne pucaj, naši smo". | Sada umesto tačke zadajemo negativnu klasu, odnosno [^"], što bukvalno znači "svaki znak osim navodnika". |
Cifre
Ovde nema puno mudrologije - \d je jedan od najkorišćenijih džokera u regularnim izrazima.
Svaka cifra | \d | g | moj_tekst4 = "Nađite žabe u močvari."; $x = 145.67; | Džoker znak \d hvata svaku cifru. |
Svaki znak koji nije cifra | \D | g | moj_tekst4 = "Nađite žabe u močvari."; $x = 145.67; | Suprotno prethodnom primeru, džoker znak \D hvata baš svaki znak koji nije cifra. |
Džoker znak unutar klase | [\da-zšđčćž] | g | moj_tekst4 = "Nađite žabe u močvari."; $x = 145.67; | Ovde smo smestili džoker znak unutar klase i dodali još sva mala slova engleske abecede kao i naša slova š, đ, č, ć, ž. |
Primena - brojevi sa separatorima i decimalama | \d{1,3}(\.\d{3})*(,\d+)? | g | 15 1.234 7,34 12.777.345,67 1234 5.4 | Evo kako bismo mogli da selektujemo brojeve sa separatorom "." i decimalnim znakom ",". Najpre zahtevamo da se na početku nalaze jedna, dve ili tri cifre \d{1,3}. Zatim zadajemo grupe od po tri cifre predvođene znakom "." i da se cela ta grupa pojavljuje nijednom ili više puta (\.\d{3})*. Na kraju, zadajemo da može da se pojavi bilo koji broj cifara \d+, predvođenih zarezom i to tako da se sve to pojavi jednom ili nijednom (,\d+)?. |
Alfanumerički znakovi
Dakle, džoker znak \w "menja" svaki alfanumerički znak. Tu spadaju slova engleske abecede, ali i cifre i donja crta.
Svaki znak od koga se može sastojati identifikator | \w | g | moj_tekst4 = "Nađite žabe u močvari."; $x = 145.67; | Evo koji znakovi će biti selektovani kada zadamo džoker \w. Potpuno isto bi bilo i da smo ga zadali kao klasu znakova - [\w]. |
Svaki znak koji ne može biti u identifikatoru | \W | g | moj_tekst4 = "Nađite žabe u močvari."; $x = 145.67; | Kao što vidimo, džoker znak \W gađa upravo suprotne znakove od \w. |
Povezivanje znakova | \w+ | g | Ova avio-kompanija ne dozvoljava prtljag teži od 21kg. | Ovde smo upotrebili i kvantifikator + koji označava jedan ili više znakova, pa smo tako povezali sve "reči". |
Nevidljivi znakovi
Konačno, bavimo se i džoker znacima koji se odnose na "specijalne" karaktere, koji se ne vide ili se manifestuju kao praznina. Jedinstveni engleski naziv za ove znakove je non-printable characters. Tu uglavnom spadaju razni kontrolni znakovi:
- razmaci
- \t - tabulatori
- \n - line feed (LF) znakovi
- \r - carriage return (CR) znakovi
- \f - form feed (FF) znakovi
- \v - vertikalni tabulatori
Ovde ćemo uglavnom imati posla sa razmacima, tabovima i enterima (LF ili CRLF).
Non-printable znakovi | \s | g | moj_tekst4 = "Nađite žabe u močvari."; $x = 145.67; | Džoker znak \s selektuje svaki "nevidljivi" znak. Odmah primećujemo razmake, a tu su i tabulatori, kao i enteri. |
Svaki "vidljivi" znak | \S | g | moj_tekst4 = "Nađite žabe u močvari."; $x = 145.67; | Džoker znak \S se odnosi na svaki "vidljivi" znak - suprotno od \s. |
Povezivanje "vidljivih" znakova | \S+ | g | Ova avio-kompanija ne dozvoljava prtljag teži od 21kg. | Ovde smo upotrebili i kvantifikator + koji označava jedan ili više znakova, pa smo tako povezali "vidljive" znakove, tj. praktično, obeležili sve "celine" odvojene razmacima i sl. karakterima. Uporedite to sa ranijim primerom povezivanja \w znakova. |
Primena - Hvatanje svih, ali baš svih znakova | "[\s\S]*" | Van navodnika... "Ovo je neki tekst unutar navodnika"... I opet van navodnika... | Ovde želimo da uhvatimo sve znakove unutar navodinka. Ne možemo koristiti džoker znak tačka, pošto je tekst unutar navodnika ispisan u više linija, a znamo da je tačka ne odnosi na znak za novi red. Umesto toga, koristimo klasu [\s\S] što znači "svi nevidljivi i svi vidljivi znakovi", odnosno bukvalno svi znakovi. |
- A. Watt (2005): Beginning Regular Expressions, Wiley Publishing, Indianapolis
- J. Goyvaerts, S. Levithan (2012): Regular Expressions Cookbook, 2nd Ed, O’Reilly, Sebastopol