Olitpa etsinyt Grepilla tai tarkastellut ohjelmia, jotka voivat kerätä tiedostoja uudelleen, olet luultavasti ihmetellyt, oliko helpompi tapa saada työsi tehtyäsi. Onneksi on olemassa, ja sitä kutsutaan "säännöllisinä ilmaisuina".
(Sarjakuva julkaisusta XKCD.com)
Säännölliset lausekkeet ovat muotoiluja, jotka on muotoiltu hyvin täsmällisesti ja jotka voivat olla monien erilaisten tulosten mukaisia. Tunnetaan myös nimellä "regex" tai "regexp", niitä käytetään ensisijaisesti haku- ja tiedostojen nimeämistoiminnoissa. Yhdestä regexistä voidaan käyttää kaavaa, jotta luodaan useita eri mahdollisia tuotoksia, joita kaikkia etsitään. Vaihtoehtoisesti voit määrittää, kuinka ryhmä tiedostoja nimetään määrittelemällä regex ja ohjelmistosi voi siirtyä portaittain seuraavaan haluttuun lähtöön. Tällä tavoin voit nimetä useita tiedostoja useisiin kansioihin helposti ja tehokkaasti ja voit siirtyä yksinkertaisen numerointijärjestelmän rajoitusten ulkopuolelle.
Koska säännöllisten lausekkeiden käyttö perustuu erityiseen syntaksiin, sinun on kyettävä lukemaan ja jäsentämään niitä. Useilla Windows- ja OS X: n erätiedostojen uudelleennimeämisohjelmilla on tukea regexpsille sekä Cross Platform -työkalun GREP-työkalua (jota koskimme Bash Scripting for Beginner Guide -oppaassa) ja Awk-komentorivityökalun * Nixille. Lisäksi monet vaihtoehtoiset tiedostonhallintaohjelmat, kantoraketit ja hakutyökalut käyttävät niitä, ja niillä on erittäin tärkeä asema ohjelmointikieleissä, kuten Perlissä ja Ruby. Muut kehitysympäristöt, kuten .NET, Java ja Python sekä tulevat C + + 11, tarjoavat kaikki tavalliset kirjastot säännöllisten lausekkeiden käyttämiseen. Kuten voitte kuvitella, ne voivat olla todella hyödyllisiä, kun yrität minimoida ohjelmaan syötetyn koodin määrän.
Ennen kuin näytämme esimerkkejä, haluaisimme huomauttaa jotain. Aiomme käyttää bash-kuorta ja grep-komentoa, jotta voimme näyttää, miten sovellamme säännöllisiä lausekkeita. Ongelmana on, että joskus haluamme käyttää erikoismerkkejä, jotka on siirrettävä grepille, ja bash-kuori tulkitsee tämän merkin, koska kuori käyttää sitä myös. Näissä olosuhteissa meidän on "poistettava" nämä merkit. Tämä voi olla hämmentävää, koska merkkien "karkaaminen" esiintyy myös regexpsin sisällä. Jos esimerkiksi haluamme syöttää tämän grepiksi:
\<
meidän on korvattava tämä seuraavilla tavoilla:
\\\<
Jokainen erikoismerkki saa yhden vastavalinnan. Vaihtoehtoisesti voit käyttää myös yksittäisiä lainauksia:
'\<'
Yksittäiset lainausmerkit kertovat NOT NOT tulkitsemaan, mitä sisällä niitä. Vaatiessamme näitä toimenpiteitä, jotta pystymme osoittamaan sinulle, ohjelmasi (etenkin GUI-pohjaiset) eivät usein edellytä näitä ylimääräisiä vaiheita. Jotta asiat olisivat yksinkertaisia ja suoraviivaisia, todellinen säännöllinen lauseke annetaan sinulle sanomana tekstinä, ja komentorivin kuvakaappauksissa näet karkaavan syntaksin.
Regexps on todella suppea tapa sanoa termejä niin, että tietokoneesi voi laajentaa niitä useisiin vaihtoehtoihin. Katsotaanpa seuraavaa esimerkkiä:
tom [0123456789]
Kaaret - [ja] - kertovat jäsentelevälle moottorille, että mikä tahansa on sisällä, minkä tahansa ONE-merkin avulla voidaan sovittaa. Mitä tahansa suluissa on, kutsutaan merkistöksi.
Joten, jos meillä olisi valtava luettelo merkinnöistä ja käytimme tätä regexia etsimään, seuraavia termejä sovitetaan yhteen:
ja niin edelleen. Seuraavaa luetteloa EI kuitenkaan sovi yhteen, joten se EI näyttäisi tuloksissasi:
Voit myös valita haun ajanjaksolla (.), Joka mahdollistaa minkä tahansa merkin läsnäolon niin kauan kuin merkki on olemassa.
Kuten näette, koukussa
.tom
ei tuonut esiin termejä, joiden alussa oli vain "tom". Jopa "vihreät tomaatit" tulivat, koska tilaa ennen "tom" on luonteeltaan luonteeltaan, mutta termejä "tomF" ei ollut alussa luonnetta, joten niitä jätettiin huomiotta.
Huomaa: Grepin oletuskäyttäytyminen on palauttaa koko tekstirivi, kun osa osasta vastaa regexia. Muut ohjelmat eivät voi tehdä tätä, ja voit poistaa tämän pois grepillä "-o" -lipun avulla.
Voit myös määrittää vuorottelun putkella (|), kuten täällä:
speciali (t | z) e
Tämä löytää molemmat:
Kun käytät grep-komentoa, meidän on poistettava erikoismerkit (, | ja) taaksepäin ja käyttää '-E' -lippua, jotta tämä toimisi ja vältät ruma virheet.
Kuten mainitsimme edellä, tämä johtuu siitä, että meidän on kerrottava bash-kuoren välittämään nämä merkit hampaisiin ja tekemättä mitään heidän kanssaan. '-E' -merkki kertoo, että grep käyttää sulkeja ja putkia erikoismerkiksi.
Voit etsiä poissulkemisen avulla haaran avulla, joka on sekä suluissa että sarjan alussa:
tom [^ F | 0-9]
Jälleen, jos käytät grep ja bash, muista paeta tästä putkesta!
Luetteloista, jotka eivät olleet näkyvissä, ovat seuraavat:
Nämä eivät sopineet regexiin.
Usein etsimme rajojen perusteella. Joskus haluamme vain merkkijonoja, jotka näkyvät sanan alussa, sanan lopussa tai koodin loppuun. Tämä voidaan tehdä helposti käyttämällä kutsumia ankkureita.
Käyttämällä varsi (sulkujen ulkopuolella) voit nimetä rivin "alku".
^ tom
Voit etsiä rivin loppua käyttämällä dollarin merkkiä.
tom $
Näet, että hakusana tulee ennen ankkuria tässä tapauksessa.
Voit myös käyttää otteluita, jotka näkyvät sanojen alussa tai lopussa, ei koko riviltä.
\<>
tom \>
Kuten mainitsimme tämän artikkelin alussa olevassa muistiossa, meidän on poistettava nämä erikoismerkit, koska käytämme bashia. Vaihtoehtoisesti voit käyttää myös yksittäisiä lainauksia:
Tulokset ovat samat. Varmista, että käytät yksittäisiä lainauksia eikä kaksinkertaisia lainauksia.
Olemme vain kärsineet jäävuoren kärjen täällä. Voit myös etsiä valuuttamerkinnöissä olevia rahan ehtoja ja etsiä kolmesta tai useammasta sopivasta termistä. Asiat voivat olla todella monimutkaisia. Jos haluat lisätietoja säännöllisistä lausekkeista, tutustu seuraaviin lähteisiin.
Voit myös luoda ja testata säännölliset lausekkeet käyttämällä ilmaista Flash-pohjaista verkkotyökalua nimeltä RegExr. Se toimii kirjoittaessasi, on ilmainen, ja sitä voi käyttää useimmissa selaimissa.
Onko suosikki käyttää säännöllisiä lausekkeita? Tietää erinomaisesta erän renamerista, joka käyttää niitä? Ehkä haluat vain ylistää grep-fu: stä. Anna mielipiteesi kommentoimalla!