Enkle RegEx-tricks til begyndere

Har du altid ønsket at lære Regular Expressions, men blev afskrækket af deres kompleksitet? I denne artikel vil jeg vise dig fem nemme at lære RegEx-tricks, som du kan begynde at bruge straks i din yndlings teksteditor.

Opsætning af teksteditor

Mens næsten enhver teksteditor understøtter Regular Expressions nu, bruger jeg Visual Studio Code til denne tutorial, men du kan bruge enhver editor, du kan lide. Bemærk også, at du normalt skal aktivere RegEx et eller andet sted i nærheden af ​​søgeindgangen. Sådan gør du det i VS-kode:

1) . - Match ethvert tegn

Lad os starte simpelt. Prikkesymbolet .matcher ethvert tegn:

b.t

Ovenfor RegEx kampe "bot”, "bat”og alle andre ord på tre bogstaver, der starter med bog ender i t. Men hvis du vil søge efter priksymbolet, skal du undslippe det med \, så denne RegEx vil kun matche den nøjagtige tekst "b.t":

b\.t

2). * - Match alt

Her .betyder "ethvert tegn" og *betyder "alt før dette symbol gentages et antal gange." Sammen ( .*) betyder de "ethvert symbol et vilkårligt antal gange." Du kan f.eks. Bruge det til at finde matches, der starter med eller slutter i en eller anden tekst. Lad os antage, at vi har en javascript-metode med følgende signatur:

loadScript(scriptName: string, pathToFile: string)

Og vi vil finde alle opkald af denne metode, hvor de pathToFilepeger på enhver fil i mappen “lua”. Du kan bruge følgende regulære udtryk til dette:

loadScript.*lua

Hvilket betyder, "match al tekst startende med “loadScript”efterfulgt af noget op til den sidste forekomst af “lua”"

3)? - Ikke-grådig kamp

Den ?symbol efter .*og nogle andre RegEx sekvenser midler ”match så lidt som muligt.” Hvis du ser på det forrige billede, vil du se, at teksten “lua”ses to gange i hver kamp, ​​og alt op til det andet “lua”blev matchet. Hvis du ønskede at matche alt op til den første forekomst af i "lua"stedet, ville du bruge følgende RegEx:

loadScript.*?lua

Hvilket betyder, "match alt, der starter med "loadScript"efterfulgt af noget, indtil den første forekomst af "lua""

4) () $ - Capture Groups and Backreferences

Okay, nu kan vi matche noget tekst. Men hvad hvis vi vil ændre dele af den tekst, vi fandt? Vi er ofte nødt til at bruge fangstgrupper til det.

Lad os antage, at vi ændrede vores loadScriptmetode, og nu har det pludselig brug for et andet argument indsat mellem de to argumenter. Lad os navn denne nye argument id, så den nye funktion signatur skal se sådan ud: loadScript(scriptName, id, pathToFile). Vi kan ikke bruge den normale erstatningsfunktion i vores teksteditor her, men et regulært udtryk er nøjagtigt det, vi har brug for.

Ovenfor kan du se resultatet af at køre følgende regulære udtryk:

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

Hvilket betyder: "match alt, der starter med "loadScript("efterfulgt af noget op til det første ,, derefter efterfulgt af noget op til det første )"

De eneste ting, der kan virke underlige her for dig, er \symbolerne. De bruges til at undslippe parenteser.

Vi er nødt til at undslippe symboler, (og )fordi de er specialtegn, der bruges af RegEx til at fange dele af den matchede tekst. Men vi er nødt til at matche faktiske parentes tegn.

I det forrige RegEx definerede vi to argumenter for vores metodekald med .*?symbolerne. Lad os gøre hvert af vores argumenter til en separat fangstgruppe ved at tilføje (og )symboler omkring dem:

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

Hvis du kører denne RegEx, vil du se, at intet ændrede sig. Dette skyldes, at den matcher den samme tekst. Men nu kan vi henvise til det første argument som $1og til det andet argument som $2. Dette kaldes backreference, og det hjælper os med at gøre, hvad vi vil: tilføj et andet argument midt i opkaldet:

Søg input:

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

Hvilket betyder det samme som det forrige RegEx, men kortlægger argumenter for at fange henholdsvis gruppe 1 og 2.

Udskift input:

loadScript($1,id,$2)

Hvilket betyder "udskift hver matchet tekst med tekst “loadScript(“efterfulgt af optagelsesgruppe 1 ,, “id”fang gruppe 2 og )". Bemærk, at du ikke behøver at slippe for parenteser i udskiftningsindgangen.

5) [] - Karakterklasser

Du kan angive tegn, du vil matche på en bestemt position, ved at placere [og ]symboler omkring disse tegn. For eksempel [0-9]matcher klassen alle cifre fra 0 til 9. Du kan også angive alle cifre eksplicit: [0123456789]- betydningen er den samme. Du kan også bruge bindestreger med bogstaver, [a-z]vil matche ethvert latinsk tegn med små bogstaver, [A-Z]vil matche ethvert stort latinsk tegn og [a-zA-Z]vil matche begge.

Du kan også bruge *efter en karakterklasse ligesom efter ., hvilket i dette tilfælde betyder: "matche et vilkårligt antal forekomster af tegnene i denne klasse"

Sidste ord

Du skal vide, at der er flere RegEx-smag. Den, jeg diskuterede her, er javascript RegEx-motor. De fleste moderne motorer er ens, men der kan være nogle forskelle. Normalt inkluderer disse forskelle escape-tegn og backreferences-mærker.

Jeg opfordrer dig til at åbne din teksteditor og begynde at bruge nogle af disse tricks lige nu. Du vil se, at du nu kan gennemføre mange refactoringopgaver meget hurtigere end før. Når du er fortrolig med disse tricks, kan du begynde at undersøge mere om regelmæssige udtryk.

Tak fordi du læste min artikel til slutningen. Tilføj klapper, hvis du fandt det nyttigt, og abonner på flere opdateringer. Jeg vil offentliggøre flere artikler om regulære udtryk, javascript og programmering generelt.