29Jun
Enten du har søkt med Grep eller ser på programmer som kan batch omdøpe filer for deg, har du sikkert lurt på om det var en enklere måte å få jobben din til. Heldigvis er det, og det kalles "regulære uttrykk."
( Tegneserie fra XKCD.com)
Hva er regulære uttrykk?
Ordinære uttrykk er uttalelser formatert på en svært spesifikk måte, og som kan stå for mange forskjellige resultater. Også kjent som "regex" eller "regexp", brukes de hovedsakelig i søk og fil navngivningsfunksjoner. En regex kan brukes som en formel for å lage en rekke forskjellige mulige utganger, som alle er søkt etter. Alternativt kan du angi hvordan en gruppe filer skal navngis ved å spesifisere en regex, og programvaren kan trinnvis flytte til neste tilsiktede utgang. På denne måten kan du omdøpe flere filer i flere mapper veldig enkelt og effektivt, og du kan bevege seg utover begrensningene i et enkelt nummereringssystem.
Fordi bruken av vanlige uttrykk stammer fra et spesielt syntaks, må programmet være i stand til å lese og analysere dem. Mange batchfilenavnsprogrammer for Windows og OS X har støtte for regexps, samt krypteringsverktøyet GREP( som vi berørte i vår Bash Scripting for Beginners Guide) og Awk kommandolinjeverktøyet for * Nix. I tillegg bruker mange alternative filbehandlere, lansere og søkeverktøy dem, og de har et svært viktig sted i programmeringsspråk som Perl og Ruby. Andre utviklingsmiljøer som. NET, Java og Python, samt den kommende C ++ 11, gir alle standardbiblioteker for bruk av vanlige uttrykk. Som du kan forestille deg, kan de være veldig nyttige når du prøver å minimere mengden kode du legger inn i et program.
En kommentar om Escaping Characters
Før vi viser deg eksempler, vil vi gjerne vise noe ut. Vi skal bruke bash-skallet og grep-kommandoen for å vise deg hvordan du bruker vanlige uttrykk. Problemet er at noen ganger vil vi bruke spesialtegn som må sendes til grep, og bash-skallet tolker det karakteret fordi skallet også bruker det. Under disse omstendighetene må vi "unnslippe" disse tegnene. Dette kan bli forvirrende fordi dette "escaping" av tegn også forekommer i regexps. For eksempel, hvis vi vil legge inn dette i grep:
\ & lt;
må vi erstatte det med:
\\\ & lt;
Hver spesiell karakter her får en tilbakeslag. Alternativt kan du også bruke enkle anførselstegn:
'\ & lt;'
Enkle sitater forteller bash IKKE å tolke hva som er inne i dem. Mens vi krever at disse trinnene skal tas slik at vi kan demonstrere for deg, vil dine programmer( spesielt GUI-baserte) ofte ikke kreve disse ekstra trinnene. For å holde ting enkelt og greit, vil det faktiske vanlige uttrykket bli gitt til deg som sitert tekst, og du vil se den rømte syntaksen i kommandolinjens skjermbilder.
Hvordan utvider de?
Regexps er en veldig kort måte å angi vilkår slik at datamaskinen din kan utvide dem til flere alternativer. La oss ta en titt på følgende eksempel:
tom [0123456789]
Firkantede parenteser - [og] - fortell analysemotoren at det som er inni, kan et hvilket som helst tegn brukes til å matche. Uansett hva som er inne i disse parentesene kalles et tegnsett.
Så, hvis vi hadde en stor liste over oppføringer, og vi brukte denne regexen til å søke, ville følgende vilkår være matchet:
- tom
- tom0
- tom1
- tom2
- tom3
og så videre. Imidlertid vil følgende liste IKKE bli matchet, og så ville ikke vises i resultatene dine:
- tomat;regex tar ikke hensyn til noen bokstaver etter "tom"
- Tom;regex er saksfølsomt!
Du kan også velge å søke etter en periode( .) Som vil tillate noen tegn tilstede, så lenge det foreligger en tegneserie.
Som du ser, grep det med
. tom
ikke opp med vilkår som bare hadde "tom" i begynnelsen. Selv "grønne tomater" kom inn, fordi plassen før "tom" teller som et tegn, men begreper som "tomF" hadde ikke et tegn i begynnelsen og ble dermed ignorert.
Merk: Greps standardoppførsel er å returnere en hel tekstlinje når noen deler samsvarer med regex. Andre programmer kan ikke gjøre dette, og du kan slå av dette i grep med '-o' flagget.
Du kan også spesifisere veksling ved hjelp av et rør( |), som her:
speciali( s | z) e
Dette finner både:
- spesialiserer
- spesialiserer
Når du bruker grep-kommandoen, må vi unnslippe spesialtegnene|, og) med backslashes samt bruk '-E' flagg for å få dette til å fungere og unngå gale feil.
Som vi nevnte ovenfor, skyldes dette at vi må fortelle bash-skallet å passere disse tegnene til grep og ikke å gjøre noe med dem.'-E'-flagget forteller grep å bruke parentesene og røret som spesialtegn.
Du kan søke ved utelukkelse ved hjelp av en hylle som er inne i firkantede parenteser og i begynnelsen av et sett:
tom [^ F | 0-9]
Igjen, hvis du bruker grep og bash, husk å unnslippedet pipe!
Vilkår som var i listen, men ikke vises:
- tom0
- tom5
- tom9
- tomF
Disse stemte ikke overens med vår regex.
Hvordan kan jeg bruke miljøer?
Ofte søker vi basert på grenser. Noen ganger vil vi bare ha strenger som vises i begynnelsen av et ord, på slutten av et ord, eller på slutten av en linje med kode. Dette kan enkelt gjøres ved å bruke det vi kaller ankre.
Ved hjelp av en hylle( utenfor parentes) kan du angi "begynnelsen" av en linje.
^ tom
Bruk dollartegnet for å søke etter slutten av en linje.
tom $
Du kan se at vår søkestreng kommer FØR ankeret i dette tilfellet.
Du kan også til kamper som vises i begynnelsen eller slutten av ordene, ikke hele linjene.
\ & lt; tom
tom \ & gt;
Som vi nevnte i notatet i begynnelsen av denne artikkelen, må vi unnslippe disse spesialtegnene fordi vi bruker bash. Alternativt kan du også bruke enkle anførselstegn:
Resultatene er de samme. Pass på at du bruker enkle anførselstegn, og ikke dobbel anførselstegn.
Andre ressurser for avanserte regexps
Vi har bare rammet toppen av isfjellet her. Du kan også søke etter pengevilkår avgrenset av valutamarkøren, og søk etter tre eller flere matchende vilkår. Ting kan bli veldig komplisert. Hvis du er interessert i å lære mer om vanlige uttrykk, kan du ta en titt på følgende kilder.
- Zytrax.com har noen sider med spesifikke eksempler på hvorfor ting gjør og ikke samsvarer.
- Regular-Expressions.info har også en killer guide til mange av de mer avanserte ting, samt en praktisk referanseside.
- Gnu.org har en side dedikert til å bruke regexps med grep.
Du kan også bygge og teste dine vanlige uttrykk ved hjelp av et gratis Flash-basert verktøy som heter RegExr. Det fungerer når du skriver, er gratis, og kan brukes i de fleste nettlesere.
Har du en favorittbruk for vanlige uttrykk? Vet om en flott batch renamer som bruker dem? Kanskje du bare vil skryte av grep-fu. Bidra med dine tanker ved å kommentere!