Hoe Basic Regular Expressions te gebruiken om beter te zoeken en tijd te besparen
Of je nu met Grep hebt gezocht of programma's hebt bekeken die batches bestanden voor je kunnen hernoemen, je hebt je waarschijnlijk afgevraagd of er een gemakkelijkere manier was om je klus te klaren. Gelukkig is dat zo en wordt het 'reguliere expressies' genoemd.
(Strip van XKCD.com)
Wat zijn reguliere expressies?
Reguliere expressies zijn statements die op een zeer specifieke manier zijn geformatteerd en die voor veel verschillende resultaten kunnen staan. Ook bekend als 'regex' of 'regexp' worden ze voornamelijk gebruikt in zoek- en bestandsnaamgevingsfuncties. Eén regex kan worden gebruikt als een formule om een aantal verschillende mogelijke outputs te creëren, waarnaar wordt gezocht. U kunt ook opgeven hoe een groep bestanden moet worden benoemd door een regex op te geven en uw software kan stapsgewijs naar de volgende bedoelde uitvoer worden verplaatst. Op deze manier kunt u meerdere bestanden in meerdere mappen heel eenvoudig en efficiënt hernoemen en kunt u verder gaan dan de beperkingen van een eenvoudig nummeringssysteem.
Omdat het gebruik van reguliere expressies afhankelijk is van een speciale syntaxis, moet uw programma in staat zijn deze te lezen en te parseren. Veel batchprogramma's voor het hernoemen van bestanden voor Windows en OS X hebben ondersteuning voor regexps, evenals de GREP voor het platformonafhankelijke zoekprogramma (die we hebben aangeroerd in onze gids Bash Scripting voor beginners) en het Awk-opdrachtregelprogramma voor * Nix. Bovendien gebruiken veel alternatieve bestandsbeheerders, opstartprogramma's en zoekhulpmiddelen deze en ze hebben een zeer belangrijke plaats in programmeertalen zoals Perl en Ruby. Andere ontwikkelomgevingen zoals .NET, Java en Python, evenals de aankomende C ++ 11, bieden allemaal standaardbibliotheken voor het gebruik van reguliere expressies. Zoals je je wel kunt indenken, kunnen ze erg handig zijn als je de hoeveelheid code probeert te minimaliseren die je in een programma stopt.
Een opmerking over het ontsnappen van personages
Voordat we u voorbeelden laten zien, willen we u graag iets laten zien. We gaan de bash-shell en de grep-opdracht gebruiken om je te laten zien hoe je reguliere expressies toepast. Het probleem is dat we soms speciale karakters willen gebruiken die moeten worden doorgegeven aan grep, en de bash-shell zal dat karakter interpreteren omdat de shell het ook gebruikt. Onder deze omstandigheden moeten we deze personages "ontsnappen". Dit kan verwarrend worden omdat dit "ontsnappen" van karakters ook voorkomt in regexps. Als we dit bijvoorbeeld in grep willen invoeren:
\<
we zullen dat moeten vervangen door:
\\\<
Elk speciaal personage krijgt hier één backslash. Als alternatief kunt u ook enkele aanhalingstekens gebruiken:
'\<'
Enkele aanhalingstekens vertellen bash NIET om te interpreteren wat erin zit. Hoewel we vereisen dat deze stappen worden genomen, zodat we voor u kunnen aantonen, hebben uw programma's (vooral op GUI-gebaseerde) vaak deze extra stappen niet nodig. Om de dingen eenvoudig en duidelijk te houden, krijgt u de werkelijke reguliere expressie als geciteerde tekst en ziet u de syntaxis met escapebomen in de schermafbeeldingen van de opdrachtregel..
Hoe ze zich uitbreiden?
Regexps zijn een heel beknopte manier om termen te vermelden, zodat uw computer ze in meerdere opties kan uitbreiden. Laten we het volgende voorbeeld eens bekijken:
tom [0123456789]
De vierkante haken - [en] - vertellen de ontleedmachine dat, wat er ook in zit, een ENIG teken kan worden gebruikt om te matchen. Wat zich ook in die haakjes bevindt, wordt een tekenset genoemd.
Dus, als we een enorme lijst met vermeldingen hadden en we gebruikten deze regex om te zoeken, dan zouden de volgende termen gematcht worden:
- Tom
- tom0
- tom1
- tom2
- TOM3
enzovoorts. De volgende lijst zou echter NIET gematcht zijn en zou dus NIET in uw resultaten verschijnen:
- tomaat; de regex houdt geen rekening met letters achter "tom"
- Tom; de regex is hoofdlettergevoelig!
Je kunt er ook voor kiezen om te zoeken met een punt (.) Waar elk karakter aanwezig is, zolang er maar een karakter aanwezig is.
Zoals je kunt zien, grepping met
.Tom
bracht geen termen naar voren die in het begin alleen "tom" hadden. Zelfs "groene tomaten" kwamen binnen, omdat de spatie voor "tom" telt als een personage, maar termen als "tomF" hadden in het begin geen karakter en werden dus genegeerd.
Opmerking: Grep's standaardgedrag is om een hele regel tekst terug te geven wanneer een deel overeenkomt met je regex. Andere programma's doen dit misschien niet en u kunt dit in grep uitschakelen met de vlag '-o'.
Je kunt ook afwisseling opgeven met een pipe (|), zoals hier:
Speciale (s | z) e
Dit zal beide vinden:
- specializeren
- specializeren
Wanneer we de grep-opdracht gebruiken, moeten we aan de speciale tekens (, |, en) ontsnappen met backslashes en de vlag '-E' gebruiken om dit te laten werken en lelijke fouten te voorkomen.
Zoals we hierboven vermeldden, is dit omdat we de bash-shell moeten vertellen om deze karakters door te geven aan grep en er niets mee te doen. De '-E'-vlag vertelt grep om de haakjes en pijp als speciale tekens te gebruiken.
U kunt zoeken op uitsluiting met behulp van een invoegteken dat zich zowel binnen uw vierkante haken als aan het begin van een reeks bevindt:
tom [^ F | 0-9]
Nogmaals, als je grep en bash gebruikt, vergeet dan niet om die pijp te ontvluchten!
Termen die in de lijst stonden maar niet werden weergegeven, zijn:
- tom0
- TOM5
- tom9
- tomF
Deze kwamen niet overeen met onze regex.
Hoe kan ik omgevingen gebruiken?
Vaak zoeken we op basis van grenzen. Soms willen we alleen strings die aan het begin van een woord verschijnen, aan het einde van een woord of aan het einde van een regel code. Dit kan eenvoudig worden gedaan met behulp van wat wij ankers noemen.
Met behulp van een hulplijn (buiten haakjes) kunt u het "begin" van een lijn aanduiden.
^ tom
Gebruik het dollarteken om naar het einde van een regel te zoeken.
tom $
U kunt zien dat onze zoekreeks VOOR het anker komt in dit geval.
U kunt ook zoeken naar overeenkomsten die aan het begin of aan het einde van woorden voorkomen, en niet hele regels.
\
tom \>
Zoals we in de opmerking aan het begin van dit artikel al noemden, moeten we aan deze speciale personages ontsnappen omdat we bash gebruiken. Als alternatief kunt u ook enkele aanhalingstekens gebruiken:
De resultaten zijn hetzelfde. Zorg ervoor dat u enkele aanhalingstekens gebruikt, en geen dubbele aanhalingstekens.
Andere bronnen voor geavanceerde regexps
We hebben hier alleen het topje van de ijsberg geraakt. U kunt ook zoeken naar geldtermen die worden aangegeven door de valutanoteerder en zoeken naar drie of meer overeenkomende termen. Het kan heel ingewikkeld worden. Als je meer wilt weten over reguliere expressies, kijk dan eens naar de volgende bronnen.
- Zytrax.com heeft enkele pagina's met specifieke voorbeelden van waarom dingen wel en niet overeenkomen.
- Regular-Expressions.info heeft ook een geweldige handleiding voor veel van de meer geavanceerde dingen, evenals een handige referentiepagina.
- Gnu.org heeft een pagina gewijd aan het gebruik van regexps met grep.
U kunt ook uw reguliere expressies samenstellen en testen met behulp van een gratis op Flash gebaseerde online tool genaamd RegExr. Het werkt terwijl u typt, is gratis en kan in de meeste browsers worden gebruikt.
Heeft u een favoriet gebruik voor reguliere expressies? Weet u van een geweldige batch-hernoemer die ze gebruikt? Misschien wil je gewoon opscheppen over je grep-fu. Deel uw mening door commentaar te geven!