29Jun
Oavsett om du har sökt med Grep eller tittat på program som kan batch byta namn på filer för dig, har du säkert undrat om det var ett enklare sätt att få ditt jobb gjort. Tack och lov är det, och det kallas "reguljära uttryck".
( Comic from XKCD.com)
Vad är reguljära uttryck?
Ordinarie uttryck är uttalanden formaterade på ett mycket specifikt sätt och det kan stå för många olika resultat.Även känd som "regex" eller "regexp" används de främst i sök- och filnamnfunktioner. En regex kan användas som en formel för att skapa ett antal olika möjliga utgångar, som alla söks efter. Alternativt kan du ange hur en grupp av filer ska namnges genom att ange en regex och din programvara kan stegvis flytta till nästa avsedda utskrift. På så sätt kan du byta namn på flera filer i flera mappar mycket enkelt och effektivt, och du kan flytta bortom gränserna för ett enkelt numreringssystem.
Eftersom användningen av reguljära uttryck bygger på en speciell syntax måste ditt program kunna läsa och analysera dem. Många batchfilnamn för Windows och OS X har stöd för regexps, liksom sökverktyget GREP( som vi berörde i vår Bash Scripting for Beginners Guide) och kommandoradsverktyget Awk för * Nix. Dessutom använder många alternativa filhanterare, startverktyg och sökverktyg dem, och de har en mycket viktig plats i programmeringsspråk som Perl och Ruby. Andra utvecklingsmiljöer som. NET, Java och Python, liksom den kommande C ++ 11, ger alla standardbibliotek för att använda reguljära uttryck. Som du kan föreställa dig kan de vara mycket användbara när du försöker minimera mängden kod du lägger i ett program.
En anteckning om Escaping Characters
Innan vi visar dig med exempel, vill vi nämna något. Vi ska använda bash-skalet och grep-kommandot för att visa dig hur man använder vanliga uttryck. Problemet är att ibland vill vi använda specialtecken som måste skickas till grep, och bash-skalet tolkar den karaktären, eftersom skalet också använder det. Under dessa omständigheter måste vi "fly" dessa karaktärer. Detta kan bli förvirrande eftersom detta "flykt" av tecken också förekommer inom regexps. Om vi till exempel vill ange detta i grep:
\ & lt;
måste vi ersätta det med:
\\\ & lt;
Varje specialtecken här får en backslash. Alternativt kan du också använda enkla citat:
'\ & lt;'
Singel citat berätta bash INTE att tolka vad som är inuti dem. Medan vi behöver ta dessa steg så kan vi visa för dig, dina program( speciellt GUI-baserade) kräver ofta inte dessa extra steg. För att hålla sakerna enkla och raka kommer det faktiska vanliga uttrycket att ges till dig som citerad text, och du får se den räddade syntaxen i kommandorads skärmdumpar.
Hur utökar de?
Regexps är ett mycket kortfattat sätt att ange villkor så att din dator kan expandera dem till flera alternativ. Låt oss ta en titt på följande exempel:
tom [0123456789]
Torghakarna - [och] - berätta för parseringsmotorn att vad som helst är inuti, kan ett och samma tecken användas för att matcha. Vad som helst inom dessa konsoler kallas en teckenuppsättning.
Så om vi hade en enorm lista över poster och vi använde denna regex för sökning, skulle följande villkor matchas:
- tom
- tom0
- tom1
- tom2
- tom3
och så vidare. Följande lista skulle emellertid inte matchas, och så skulle inte visas i dina resultat:
- tomat;Regex redovisar inte några bokstäver efter "tom"
- Tom;regex är skiftlägeskänslig!
Du kan också välja att söka med en period( .) Som tillåter alla teckenuppdrag, så länge det finns en teckenuppgift.
Som du kan se, greppades med
. tom
tog inte upp villkor som bara hade "tom" i början.Även "gröna tomater" kom in eftersom rymden före "tom" räknas som en karaktär, men termer som "tomF" hade inte ett tecken i början och ignorerades därmed.
Obs! Greps standardbeteende är att returnera en hel rad text när någon del matchar din regex. Andra program kanske inte gör det här, och du kan stänga av det med greppet '-o'.
Du kan också ange alternering med ett rör( |), som här:
speciali( s | z) e
Det här finner både:
- specialisera
- specialisera
När grep-kommandot används måste vi undvika specialtecken( ,|, och) med backslashes samt använda '-E' -flaggan för att få det att fungera och undvika fula fel.
Som vi nämnde ovan beror det på att vi måste berätta bash-skalet för att skicka dessa tecken till grep och inte göra någonting med dem. Flaggan '-E' berättar grep om att använda parenteserna och röret som specialtecken.
Du kan söka uteslutande med hjälp av en hylsa som ligger inuti dina hakparenteser och i början av en uppsättning:
tom [^ F | 0-9]
Återigen, om du använder grep och bash, kom ihåg att flydet röret!
Villkor som fanns i listan men visade INTE:
- tom0
- tom5
- tom9
- tomF
Dessa matchade inte vår regex.
Hur kan jag utnyttja miljöer?
Ofta söker vi baserat på gränser. Ibland behöver vi bara strängar som visas i början av ett ord, i slutet av ett ord, eller i slutet av en rad kod. Detta kan enkelt göras med det vi kallar ankare.
Med hjälp av en caret( utanför parentes) kan du ange "början" på en linje.
^ tom
Använd dollartyget för att söka efter slutet av en rad.
tom $
Du kan se att vår söksträng kommer före FÄRGET i detta fall.
Du kan också använda matchningar som visas i början eller slutet av orden, inte hela raderna.
\ & lt; tom
tom \ & gt;
Som vi nämnde i anteckningen i början av den här artikeln måste vi fly från dessa specialtecken eftersom vi använder bash. Alternativt kan du också använda enkla citat:
Resultaten är desamma. Se till att du använder enkla citat och inte dubbel citat.
Andra resurser för avancerade regexps
Vi har bara träffat toppen av isberget här. Du kan också söka efter pengevillkor som anges av valutamarkören och söka efter tre eller flera matchande termer. Saker kan bli väldigt komplicerade. Om du är intresserad av att lära dig mer om reguljära uttryck, vänligen kolla på följande källor.
- Zytrax.com har några sidor med specifika exempel på varför saker och ting inte matchar.
- Regular-Expressions.info har också en mördare guide till många mer avancerade saker, liksom en praktisk referenssida.
- Gnu.org har en sida dedikerad till att använda regexps med grep.
Du kan också bygga och testa dina reguljära uttryck med ett gratis Flash-baserat onlineverktyg som heter RegExr. Det fungerar när du skriver, är gratis och kan användas i de flesta webbläsare.
Har du en favoritanvändning för reguljära uttryck? Vet om en stor sats renamer som använder dem? Kanske vill du bara skryta om din grep-fu. Bidra med dina tankar genom att kommentera!