Sådan bruges grundlæggende regelmæssige udtryk for at søge bedre og spare tid
Uanset om du har søgt med Grep eller ser på programmer, der kan batch omdøbe filer til dig, har du sikkert spekuleret på, om der var en nemmere måde at få dit arbejde på. Heldigvis er der, og det hedder "regulære udtryk".
(Tegneserie fra XKCD.com)
Hvad er regulære udtryk?
Regelmæssige udtryk er udsagn formateret på en meget specifik måde, og det kan stå for mange forskellige resultater. Også kendt som "regex" eller "regexp", bruges de primært til søgning og fil navngivning funktioner. En regex kan bruges som en formel til at oprette en række forskellige mulige output, som alle søges efter. Alternativt kan du angive, hvordan en gruppe af filer skal navngives ved at angive en regex, og din software kan trinvist flytte til den næste tilsigtede udgang. På denne måde kan du omdøbe flere filer i flere mapper meget nemt og effektivt, og du kan flytte ud over begrænsningerne af et simpelt nummereringssystem.
Fordi brugen af regulære udtryk er afhængig af en særlig syntaks, skal dit program være i stand til at læse og analysere dem. Mange batch-filnavneprogrammer til Windows og OS X har støtte til regexps, samt platformsøgningsværktøjet GREP (som vi rørte ved i vores Bash Scripting for Beginners Guide) og Awk-kommandolinjeværktøjet til * Nix. Derudover bruger mange alternative filadministratorer, launchers og søgeværktøjer dem, og de har et meget vigtigt sted i programmeringssprog som Perl og Ruby. Andre udviklingsmiljøer som .NET, Java og Python, såvel som den kommende C ++ 11, giver alle standardbiblioteker til brug af regulære udtryk. Som du kan forestille dig, kan de være meget nyttige, når du forsøger at minimere mængden af kode, du lægger i et program.
En note om undslippe tegn
Før vi viser dig eksempler, vil vi gerne pege på noget. Vi skal bruge bash shell og grep-kommandoen til at vise dig, hvordan du bruger almindelige udtryk. Problemet er, at vi nogle gange vil bruge specialtegn, der skal sendes til grep, og bash-skalen fortolker det tegn, fordi skallen også bruger det. Under disse omstændigheder skal vi "undslippe" disse tegn. Dette kan blive forvirrende, fordi denne "undslippe" af tegn også forekommer i regexps. For eksempel, hvis vi ønsker at indtaste dette i grep:
\<
vi bliver nødt til at erstatte det med:
\\\<
Hvert særligt tegn her får en tilbageslag. Alternativt kan du også bruge single citater:
'\<'
Enkelt citater fortælle bash IKKE at fortolke, hvad der er inde i dem. Mens vi kræver disse trin, så vi kan demonstrere for dig, vil dine programmer (især GUI-baserede) ofte ikke kræve disse ekstra trin. For at holde tingene enkle og ligefrem, vil det faktiske regulære udtryk blive givet til dig som citeret tekst, og du får vist den undslippede syntaks i kommandolinjebillederne.
Hvordan udvider de?
Regexps er en meget kortfattet måde at angive vilkår på, så din computer kan udvide dem til flere muligheder. Lad os se på følgende eksempel:
tom [0123456789]
De firkantede parenteser - [og] - fortælle parseringsmotoren, at hvad der er indeni, kan ethvert tegn bruges til at matche. Uanset hvad der er inde i disse parenteser kaldes et tegnsæt.
Så hvis vi havde en enorm liste over indgange, og vi brugte denne regex til at søge, ville følgende udtryk blive matchet:
- Tom
- tom0
- tom1
- tom2
- tom3
og så videre. Imidlertid vil følgende liste IKKE blive matchet, og det vil IKKE vises i dine resultater:
- tomat; regexen tegner sig ikke for nogen bogstaver efter "tom"
- Tom; regex er sagerfølsom!
Du kan også vælge at søge med en periode (.), Som vil tillade enhver tegn til stede, så længe der er en tegn til stede.
Som du kan se, grebe med
.Tom
gav ikke op udtryk, der kun havde "tom" i begyndelsen. Selv "grønne tomater" kom ind, fordi rummet før "tom" tæller som et tegn, men udtryk som "tomF" havde ikke en karakter i begyndelsen og blev dermed ignoreret.
Bemærk: Greps standardadfærd er at returnere en hel tekstlinje, når en del svarer til din regex. Andre programmer kan muligvis ikke gøre dette, og du kan slukke dette i grep med '-o' flag.
Du kan også angive veksling ved hjælp af et rør (|), som her:
speciali (r | z) e
Dette vil finde både:
- specialisere
- specialisere
Når man bruger grep-kommandoen, skal vi undslippe specialtegnene (, |, og) med tilbageslag og bruge '-E'-flag for at få dette til at fungere og undgå grimme fejl.
Som vi nævnt ovenfor skyldes det, at vi skal fortælle bash shell at passere disse tegn til grep og ikke at gøre noget med dem. '-E'-flagmet fortæller grep at bruge parenteserne og røret som specialtegn.
Du kan søge ved udelukkelse ved hjælp af en karm, der er både inden for dine firkantede parenteser og i begyndelsen af et sæt:
Tom [^ F | 0-9]
Igen, hvis du bruger grep og bash, husk at undslippe det rør!
Vilkår, der var på listen, men ikke vises:
- tom0
- tom5
- tom9
- tomF
Disse matchede ikke vores regex.
Hvordan kan jeg udnytte miljøer?
Ofte søger vi baseret på grænser. Nogle gange vil vi kun have strenge, der vises i begyndelsen af et ord, i slutningen af et ord eller ved enden af en kode. Dette er let kan gøres ved hjælp af det, vi kalder ankre.
Ved hjælp af en karet (uden parentes) kan du angive "begyndelsen" af en linje.
^ tom
For at søge efter enden af en linje skal du bruge dollartegnet.
Tom $
Du kan se, at vores søgestreng kommer FØR ankeret i dette tilfælde.
Du kan også til kampe, der vises i begyndelsen eller slutningen af ordene, ikke hele linjer.
\
Tom \>
Som vi nævnte i notatet i begyndelsen af denne artikel, er vi nødt til at undslippe disse specialtegn, fordi vi bruger bash. Alternativt kan du også bruge single citater:
Resultaterne er de samme. Sørg for at bruge enkle citater og ikke dobbelte citater.
Andre ressourcer til avancerede regexps
Vi har kun ramt toppen af isbjerget her. Du kan også søge efter pengevilkår afgrænset af valutamarkøren og søge efter tre eller flere matchende udtryk. Ting kan blive meget komplicerede. Hvis du er interesseret i at lære mere om regulære udtryk, så tag et kig på følgende kilder.
- Zytrax.com har et par sider med specifikke eksempler på hvorfor tingene gør og ikke stemmer overens.
- Regular-Expressions.info har også en killer guide til mange af de mere avancerede ting, samt en praktisk reference side.
- Gnu.org har en side dedikeret til at bruge regexps med grep.
Du kan også opbygge og teste dine regulære udtryk ved hjælp af et gratis Flash-baseret online værktøj kaldet RegExr. Det fungerer som du skriver, er gratis, og kan bruges i de fleste browsere.
Har du en favorit brug for regulære udtryk? Kendskab til en stor batch renamer, der bruger dem? Måske vil du bare prale om din grep-fu. Bidrag dine tanker ved at kommentere!