Så här använder du vanliga reguljära uttryck för att söka bättre och spara tid
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. Lyckligtvis finns det, och det kallas "reguljära uttryck".
(Komik från XKCD.com)
Vad är reguljära uttryck?
Regelbundna 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 tänka dig kan de vara mycket användbara när du försöker minimera antalet koden du lägger in i ett program.
En anteckning om flyktiga tecken
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 vi ibland vill 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. Till exempel, om vi vill ange detta i grep:
\<
vi måste ersätta det med:
\\\<
Varje specialtecken här får en backslash. Alternativt kan du också använda enkla citat:
'\<'
Enkla 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 dem??
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 parsningsmotorn att vad som helst är inuti, kan något tecken användas för att matcha. Vad som helst inom dessa konsoler kallas en teckenuppsättning.
Så, om vi hade en stor lista med poster och vi använde denna regex för att söka, skulle följande termer matchas:
- tom
- tom0
- TOM1
- TOM2
- tom3
och så vidare. Följande lista skulle emellertid inte matchas, så det skulle inte visas i dina resultat:
- tomat; regex tar inte hänsyn till 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, grepp med
.tom
gav 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 en karaktär 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 växelverkan med ett rör (|), som här:
speciali (s | z) e
Detta kommer att hitta både:
- specialisera
- specialisera
När vi använder grep-kommandot måste vi flytta specialtegn (, |, och) med backslashes och 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 korg som är både inuti dina kvadratkonsoler och i början av en uppsättning:
tom [^ F | 0-9]
Återigen, om du använder grep och bash, kom ihåg att fly det röret!
Villkor som fanns i listan men visade inte upp är:
- 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 är enkelt att göra med det vi kallar ankare.
Med hjälp av en caret (utanför parentes) kan du ange "början" på en rad.
^ tom
För att söka efter slutet av en rad, använd dollartecken.
Tom $
Du kan se att vår söksträng kommer före fästet i det här fallet.
Du kan också för matchningar som visas i början eller slutet av orden, inte hela raderna.
\
tom \>
Som vi nämnde i anteckningen i början av den här artikeln måste vi fly 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.
Övriga 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, var god titta 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 av de mer avancerade sakerna, 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!