Kako koristiti osnovne regularne izraze za traženje boljeg i uštedu vremena
Bez obzira jeste li pretraživali pomoću Grepa ili gledali programe koji za vas mogu preimenovati datoteke, vjerojatno ste se pitali postoji li lakši način za obavljanje posla. Srećom, postoji i zove se "regularni izrazi."
(Strip od XKCD.com)
Što su regularni izrazi?
Regularni izrazi su izjave oblikovane na vrlo specifičan način i mogu predstavljati mnogo različitih rezultata. Također poznati kao "regex" ili "regexp", prvenstveno se koriste u funkcijama imenovanja i pretraživanja datoteka. Jedan regex se može koristiti kao formula za stvaranje nekoliko različitih mogućih izlaza, od kojih se svi traže. Alternativno, možete odrediti kako grupu datoteka treba imenovati navođenjem regexa, a vaš softver može postupno prijeći na sljedeći željeni izlaz. Na taj način možete preimenovati više datoteka u više mapa vrlo jednostavno i učinkovito, a možete se pomaknuti i izvan ograničenja jednostavnog sustava numeriranja.
Budući da se korištenje regularnih izraza oslanja na posebnu sintaksu, vaš program mora biti sposoban čitati ih i raščlaniti. Mnogi programi za preimenovanje serijskih datoteka za Windows i OS X imaju podršku za regexps, kao i alat za pretraživanje GREP (koji smo dotakli u našem Bash Scriptingu za Vodič za početnike) i alat za naredbeni redak Awk za * Nix. Osim toga, koriste ih mnogi alternativni upravitelji datoteka, pokretači i alati za pretraživanje, a oni imaju vrlo važno mjesto u programskim jezicima kao što su Perl i Ruby. Druga razvojna okruženja kao što su .NET, Java i Python, kao i nadolazeći C ++ 11, pružaju standardne knjižnice za korištenje regularnih izraza. Kao što možete zamisliti, oni mogu biti vrlo korisni kada pokušavate smanjiti količinu koda koji ste stavili u program.
Napomena o znakovima za bijeg
Prije nego što vam pokažemo primjere, željeli bismo nešto istaknuti. Koristit ćemo bash shell i grep naredbu kako bismo vam pokazali kako primijeniti regularne izraze. Problem je u tome što ponekad želimo koristiti posebne znakove koji se moraju proslijediti grep-u, a bash shell će interpretirati taj znak jer ga ljuska također koristi. U takvim okolnostima, moramo “pobjeći” od tih znakova. To može biti zbunjujuće jer se to „bježanje“ znakova događa i unutar regexps-a. Na primjer, ako ovo želimo unijeti u grep:
\<
to ćemo morati zamijeniti s:
\\\<
Svaki posebni znak ovdje dobiva jednu obrnutu crtu. Alternativno, možete koristiti i jednostruke navodnike:
„\<'
Pojedinačni navodnici kažu bash NE da interpretira ono što je unutar njih. Iako mi trebamo poduzeti ove korake kako bismo vam mogli demonstrirati, vaši programi (osobito oni koji se temelje na GUI) često neće zahtijevati ove dodatne korake. Da bi stvari bile jednostavne i jednostavne, stvarni regularni izraz dobivat će vam se kao citirani tekst i vidjet ćete odbačenu sintaksu u snimkama zaslona naredbenog retka.
Kako se proširuju?
Regexps su stvarno sažeti način navođenja izraza tako da ih vaše računalo može proširiti na više opcija. Pogledajmo sljedeći primjer:
Tom [0123456789]
Kvadratne zagrade - [i] - kažu raščlanjivanju motora da je sve što je unutra, bilo koji JEDAN znak može se koristiti da se podudara. Ono što se nalazi unutar tih zagrada naziva se skup znakova.
Dakle, ako bismo imali ogroman popis unosa i koristili smo ovaj regex za pretraživanje, sljedeći bi se izrazi podudarali:
- mužjak nekih malih životinja
- tom0
- tom1
- tom2
- tom3
i tako dalje. Međutim, sljedeći popis NEĆE se podudarati, pa se NE prikazuje u vašim rezultatima:
- rajčica; regex ne uzima u obzir slova nakon "tom"
- Tom; Regex je osjetljiv na velika i mala slova!
Možete odabrati i pretraživanje s razdobljem (.) Koje će omogućiti prisutnost bilo kojeg znaka, sve dok postoji znak.
Kao što možete vidjeti, navući se
.mužjak nekih malih životinja
nije spomenuo pojmove koji su na početku imali samo "tom". Čak su se pojavile i „zelene rajčice“, jer se prostor prije „tom“ računa kao lik, ali izrazi poput „tomF“ nisu imali karakter na početku i stoga su ignorirani.
Napomena: Grepovo zadano ponašanje je vratiti cijeli redak teksta kad neki dio odgovara vašem regexu. Drugi programi to možda neće učiniti, a to možete isključiti u grep-u s oznakom "-o".
Također možete navesti izmjenu pomoću cijevi (|), kao ovdje:
speciali (e | z) e
Naći ćete i sljedeće:
- Specijalizirani
- Specijalizirani
Kada koristite naredbu grep, trebamo pobjeći od posebnih znakova (, |, i) s obrnutim crtama, kao i koristiti zastavicu "-E" da bi se to učinilo i izbjegli ružne pogreške.
Kao što smo već spomenuli, to je zato što moramo reći bash ljusci da proslijedi ove znakove u grep i da ne radi ništa s njima. Zastava '-E' kaže grepu da koristi zagrade i cijevi kao posebne znakove.
Možete pretraživati po isključenju pomoću oznake koja se nalazi unutar uglatih zagrada i na početku skupa:
Tom [^ F | 0-9]
Opet, ako koristite grep i bash, ne zaboravite pobjeći od te cijevi!
Pojmovi koji su se nalazili na popisu, ali NISU prikazani, su:
- tom0
- tom5
- tom9
- tomF
Ovo se ne podudara s našim regexom.
Kako mogu koristiti okruženje?
Često tražimo na temelju granica. Ponekad želimo samo nizove koji se pojavljuju na početku riječi, na kraju riječi ili na kraju retka koda. To se lako može učiniti pomoću onoga što nazivamo sidrima.
Korištenje znaka za izoštravanje (izvan zagrada) omogućuje vam da odredite "početak" retka.
^ tam
Da biste potražili kraj retka, upotrijebite znak za dolar.
Tom $
Možete vidjeti da se naš traženi niz pojavljuje PRIJE sidra u ovom slučaju.
Možete i za utakmice koje se pojavljuju na početku ili na kraju riječi, a ne cijele retke.
\
Tom \>
Kao što smo spomenuli u bilješci na početku ovog članka, trebamo pobjeći od ovih posebnih znakova jer koristimo bash. Alternativno, možete koristiti i jednostruke navodnike:
Rezultati su isti. Provjerite koristite li jednostruke navodnike, a ne dvostruke navodnike.
Ostali resursi za napredne Regexps
Ovdje smo samo pogodili vrh ledenog brijega. Možete tražiti i novčane izraze označene valutnom oznakom i pretražiti bilo koji od tri ili više podudarnih izraza. Stvari mogu postati jako komplicirane. Ako vas zanima više o regularnim izrazima, pogledajte sljedeće izvore.
- Zytrax.com ima nekoliko stranica s konkretnim primjerima zašto stvari stoje i ne odgovaraju.
- Regularni Expresspress.info ima i ubojiti vodič za mnogo naprednijih stvari, kao i praktičnu stranicu s uputama.
- Gnu.org ima stranicu posvećenu korištenju regexps-a s grep-om.
Također možete izgraditi i testirati svoje regularne izraze pomoću besplatnog online alata nazvanog RegExr koji se temelji na Flashu. Djeluje dok tipkate, besplatan je i može se koristiti u većini preglednika.
Imate li omiljenu upotrebu za regularne izraze? Znate li velikog serijskog preimenovanja koji ih koristi? Možda se samo hvališ svojim grep-fu. Doprinosite svojim mislima komentirajući!