29Jun

Hoe Basic Regular Expressions te gebruiken om beter te zoeken en tijd te besparen

click fraud protection

Of u nu met Grep hebt gezocht of naar programma's hebt gekeken die batches bestanden voor u kunnen hernoemen, u hebt zich waarschijnlijk afgevraagd of er een gemakkelijkere manier was om uw klus te klaren. Gelukkig is dat er, en het wordt 'reguliere expressies' genoemd.

( Comic van XKCD.com)

Wat zijn reguliere expressies?

Reguliere expressies zijn statements die op een zeer specifieke manier zijn opgemaakt en die voor veel verschillende resultaten kunnen gelden. 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 heel eenvoudig en efficiënt meerdere bestanden in meerdere mappen hernoemen en kunt u verder gaan dan de beperkingen van een eenvoudig nummeringssysteem.

instagram viewer

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 programma's voor het hernoemen van batchbestanden voor Windows en OS X hebben ondersteuning voor regexps, evenals de GREP-tool voor meerdere platformen( die we hebben aangeroerd in onze handleiding Bash Scripting voor beginners) en de Awk-opdrachtregel voor * Nix. Daarnaast 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 inbeelden, kunnen ze erg handig zijn als je de hoeveelheid code probeert te minimaliseren die je in een programma stopt.

A 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. In 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:

\ & lt;

zullen we dat moeten vervangen door:

\\\ & lt;

Elk speciaal personage krijgt hier één backslash. Als alternatief kunt u ook enkele aanhalingstekens gebruiken:

'\ & lt;'

Enkele aanhalingstekens geven aan bash NIET te interpreteren wat erin zit. Hoewel we vereisen dat deze stappen worden genomen, zodat we voor u kunnen demonstreren, zullen uw programma's( vooral op GUI-gebaseerde) vaak deze extra stappen niet vereisen. Om de dingen eenvoudig en duidelijk te houden, wordt de werkelijke reguliere expressie aan u gegeven als geciteerde tekst en ziet u de syntaxis met escapebomen in de schermafbeeldingen van de opdrachtregel.

Hoe breiden ze zich uit?

Regexps zijn een zeer 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, elk ONE-teken kan worden gebruikt om te matchen. Wat zich ook in die haakjes bevindt, wordt een tekenset genoemd.

Als we dus een enorme lijst met vermeldingen hadden en we deze regex gebruikten om te zoeken, werden de volgende termen vergeleken:

  • tom
  • tom0
  • tom1
  • tom2
  • tom3

enzovoort. De volgende lijst zou echter NIET gematcht zijn en zou dus NIET in uw resultaten verschijnen:

  • -tomaat;de regex houdt geen rekening met eventuele letters na "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, heeft grepping met

. tom

geen termen opgeleverd die in het begin alleen "tom" hadden. Zelfs "groene tomaten" kwamen binnen, omdat de spatie vóór "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 specificeren met behulp van een pipe( |), zoals hier:

speciali( s | z) e

Dit zal beide vinden:

  • specialiseren
  • specialiseren

Wanneer we de grep-opdracht gebruiken, moeten we ontsnappen aan de speciale tekens( ,null,|, and) met backslashes en gebruik de '-E'-vlag 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 geeft grep de opdracht 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 u grep en bash gebruikt, vergeet dan niet te ontsnappendie pijp!

Termen die in de lijst stonden maar NIET werden getoond 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.

Door een caret( buiten haakjes) te gebruiken, 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

tom \ & gt;

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 slechts 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 goede 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 uw reguliere expressies ook bouwen en testen met 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 opscheppen over je grep-fu. Draag uw mening bij door te reageren!