Enkle RegEx-triks for nybegynnere

Har du alltid ønsket å lære Regular Expressions, men ble skremt av kompleksiteten? I denne artikkelen vil jeg vise deg fem enkle å lære RegEx-triks som du kan begynne å bruke umiddelbart i favoritt teksteditoren din.

Teksteditoroppsett

Mens nesten hvilken som helst teksteditor støtter Regular Expressions nå, vil jeg bruke Visual Studio Code for denne opplæringen, men du kan bruke hvilken som helst redaktør du liker. Vær også oppmerksom på at du vanligvis trenger å slå på RegEx et sted nær søkeinngangen. Slik gjør du dette i VS-kode:

1) . - Match alle tegn

La oss starte enkelt. Prikkesymbolet .samsvarer med alle tegn:

b.t

Ovenfor samsvarer RegEx "bot”, "bat”og ethvert annet ord med tre tegn som starter med bog slutter på t. Men hvis du vil søke etter prikkesymbolet, må du unnslippe det med \, så denne RegEx vil bare matche den eksakte teksten "b.t":

b\.t

2). * - Match noe

Her .betyr "hvilket som helst tegn" og *betyr "alt før dette symbolet gjentas et antall ganger." Sammen ( .*) betyr de "ethvert symbol hvor mange ganger som helst." Du kan for eksempel bruke den til å finne treff som begynner med eller slutter på tekst. La oss anta at vi har en javascript-metode med følgende signatur:

loadScript(scriptName: string, pathToFile: string)

Og vi vil finne alle samtaler med denne metoden der de pathToFilepeker på hvilken som helst fil i mappen “lua”. Du kan bruke følgende regulære uttrykk for dette:

loadScript.*lua

Hvilket betyr, "matche all tekst som begynner med “loadScript”etterfulgt av noe til siste forekomst av “lua”"

3)? - Ikke-grådig kamp

Den ?symbol etter .*og noen andre RegEx sekvenser midler “kamp så lite som mulig.” Hvis du ser på forrige bilde, vil du se at teksten “lua”blir sett to ganger i hver kamp, ​​og alt opp til det andre “lua”ble matchet. Hvis du vil matche alt opp til den første forekomsten av i "lua"stedet, vil du bruke følgende RegEx:

loadScript.*?lua

Hvilket betyr, "matche alt som begynner med "loadScript"etterfulgt av noe opp til den første forekomsten av "lua""

4) () $ - Capture Groups and Backreferences

OK, nå kan vi matche litt tekst. Men hva om vi vil endre deler av teksten vi fant? Vi må ofte bruke fangstgrupper til det.

La oss anta at vi endret loadScriptmetoden vår , og nå trenger den plutselig et nytt argument satt inn mellom de to argumentene. La oss navn denne nye argument id, slik at den nye funksjonen signaturen skal se slik ut: loadScript(scriptName, id, pathToFile). Vi kan ikke bruke normal erstatningsfunksjon i tekstredigereren vår her, men et vanlig uttrykk er akkurat det vi trenger.

Ovenfor kan du se resultatet av å kjøre følgende regulære uttrykk:

loadScript\(.*?,.*?\)

Hvilket betyr: "Match alt som begynner med "loadScript("etterfulgt av noe opp til det første ,, deretter etterfulgt av noe opp til det første )"

Det eneste som kan virke rart her for deg er \symbolene. De brukes til å unnslippe braketter.

Vi må unnslippe symboler, (og )fordi de er spesialtegn som brukes av RegEx for å fange deler av den samsvarende teksten. Men vi må matche faktiske braketttegn.

I forrige RegEx definerte vi to argumenter for metoden vår med .*?symbolene. La oss gjøre hvert av våre argumenter til en egen fangstgruppe ved å legge til (og )symboler rundt dem:

loadScript\((.*?),(.*?)\)

Hvis du kjører denne RegEx, vil du se at ingenting er endret. Dette er fordi den samsvarer med den samme teksten. Men nå kan vi referere til det første argumentet som $1og til det andre argumentet som $2. Dette kalles backreference, og det vil hjelpe oss å gjøre det vi vil: legg til et annet argument midt i samtalen:

Søkeinngang:

loadScript\((.*?),(.*?)\)

Noe som betyr det samme som forrige RegEx, men kartlegger argumenter for å fange opp henholdsvis gruppe 1 og 2.

Erstatt inngang:

loadScript($1,id,$2)

Hvilket betyr "erstatt hver samsvarende tekst med tekst “loadScript(“etterfulgt av fangstgruppe 1 “id”,, fangstgruppe 2 og )". Merk at du ikke trenger å unnslippe braketter i erstatningsinngangen.

5) [] - Karakterklasser

Du kan liste tegn du vil matche på en bestemt posisjon ved å plassere [og ]symboler rundt disse tegnene. For eksempel [0-9]samsvarer klassen med alle sifrene fra 0 til 9. Du kan også liste opp alle sifrene eksplisitt: [0123456789]- betydningen er den samme. Du kan også bruke bindestreker med bokstaver, [a-z]vil matche hvilket som helst lite latinsk tegn, [A-Z]vil matche et hvilket som helst stort latinsk tegn og [a-zA-Z]vil matche begge.

Du kan også bruke *etter en tegnklasse akkurat som etter ., noe som i dette tilfellet betyr: "matche et hvilket som helst antall forekomster av tegnene i denne klassen"

Siste ord

Du bør vite at det er flere RegEx-smaker. Den jeg diskuterte her er javascript RegEx-motor. De fleste moderne motorer er like, men det kan være noen forskjeller. Vanligvis inkluderer disse forskjellene fluktfigurer og bakreferanser.

Jeg ber deg om å åpne tekstredigereren din og begynne å bruke noen av disse triksene akkurat nå. Du vil se at du nå kan fullføre mange refactoring-oppgaver mye raskere enn før. Når du er komfortabel med disse triksene, kan du begynne å undersøke mer på vanlige uttrykk.

Takk for at du leser artikkelen min til slutt. Legg til klapper hvis du syntes det var nyttig, og abonner på flere oppdateringer. Jeg vil publisere flere artikler om vanlige uttrykk, javascript og programmering generelt.