Tanuljon meg reguláris kifejezéseket ezzel az ingyenes tanfolyammal

"Néhány ember, ha szembesül egy problémával, azt gondolja:" Tudom, rendszeres kifejezéseket fogok használni. " Most két problémájuk van. -Jamie Zawinski

Néhány ember számára problémát jelenthet a reguláris kifejezések használata. De ez nem feltétlenül jelent problémát az Ön számára. Ez a cikk egy teljes kurzus a reguláris kifejezésekről.

1. Bemutatkozás

A rendszeres kifejezéseket, vagy csak a RegEx-et szinte az összes programozási nyelven használják, hogy meghatározzanak egy keresési mintát, amely felhasználható a karakterláncban található dolgok keresésére.

Kidolgoztam egy ingyenes, teljes videó tanfolyamot a Scrimba.com-on, hogy megtanítsam a reguláris kifejezések alapjait.

Ez a cikk írásban tartalmazza a tanfolyamot. De ha szívesebben néznéd meg a videót interaktív leckékkel, megnézheted a Scrimba oldalon. A cikk szakaszai megfelelnek a Scimba tanfolyam szakaszainak.

Ez a tanfolyam a RegEx tananyaggal együtt zajlik a freeCodeCamp.org címen. Ezt ellenőrizheti kódolási kihívások és tanúsítvány megszerzése érdekében.

Ezek a leckék a RegEx JavaScript használatára összpontosítanak, de az alapelvek számos más programozási nyelven érvényesek, amelyet Ön választott. Ha még nem ismeri az alapvető JavaScript-et, akkor hasznos lehet, ha először egy kicsit lefedi. Van egy alapszintű JavaScript-tanfolyamom is, amelyet elérhet a Scrimba és a freeCodeCamp.org YouTube csatornán.

Tehát kezdjük! Pillanatok alatt megmentheti a napot. ?

2. A vizsgálati módszer használata

Ahhoz, hogy a RegEx használatával illesszük a karakterláncok egyes részeit, létre kell hoznunk olyan mintákat, amelyek elősegítik az egyeztetést. Jelölhetjük, hogy valami RegEx minta, ha a mintát perjelek közé helyezzük /, így /pattern-we-want-to-match/.

Nézzünk meg egy példát:

// We want to check the following sentencelet sentence = "The dog chased the cat."
// and this is the pattern we want to match.let regex = /the/

Figyelje meg, hogyan szoktuk /the/jelezni, hogy a „mi” -t keressük sentence.

A RegEx test()módszerrel megtudhatjuk, hogy van-e minta a karakterláncban, vagy sem.

// String we want to testlet myString = "Hello, World!";
// Pattern we want to findlet myRegex = /Hello/;
// result is now truelet result = myRegex.test(myString);

3. Match Literal Strings

Most keressük meg Waldót.

let waldoIsHiding = "Somewhere Waldo is hiding in this text.";let waldoRegex = /Waldo/;
// test() returns true, so result is now also truelet result = waldoRegex.test(waldoIsHiding);

Ne feledje, hogy ebben a példában waldoRegexa kis- és nagybetűk különböznek egymástól, tehát ha /waldo/kis betűvel írnánk, akkor resulthamisak lennénk.

4. Illesszen össze egy szó szerinti húrot különböző lehetőségekkel

A RegEx rendelkezik ORoperátorral is, amely |karakter.

let petString = "James has a pet cat.";
// We can now try to find if either of the words are in the sentencelet petRegex = /dog|cat|bird|fish/;
let result = petRegex.test(petString);

5. Hagyja figyelmen kívül az esetet az egyezés során

Eddig mintákat vizsgáltunk, amikor a betűk esete számított. Hogyan tehetjük a RegEx mintáinkat kis-és nagybetűkre?

A kis- és nagybetűk figyelmen kívül hagyásához megtehetjük úgy, hogy hozzáadjuk a izászlót a minta végéhez, hasonlóan /some-pattern/i.

let myString = "freeCodeCamp";
// We ignore case by using 'i' flaglet fccRegex = /freecodecamp/i;
// result is truelet result = fccRegex.test(myString);

6. Bontsa ki a gyufákat

Ha ki akarjuk vonni az egyeztetett értéket, akkor használhatjuk a match()módszert.

let extractStr = "Extract the word 'coding' from this string.";
let codingRegex = /coding/;
let result = extractStr.match(codingRegex);
console.log(result);
// Terminal will show: // > ["coding"]

7. Találjon többet, mint az első meccs

Most, amikor tudjuk, hogyan kell kivonni egy értéket, és a gzászló segítségével több érték is kinyerhető

let testStr = "Repeat, Repeat, Repeat";
let ourRegex = /Repeat/g;
testStr.match(ourRegex); // returns ["Repeat", "Repeat", "Repeat"]

Kombinálhatjuk a gzászlót a izászlóval, hogy több gyufát nyerjünk ki, és figyelmen kívül hagyjuk a burkolatot.

let twinkleStar = "Twinkle, twinkle, little star";
let starRegex = /twinkle/ig;// writing /twinkle/gi would have the same result.
let result = twinkleStar.match(starRegex);
console.log(result);
// Terminal will show: // > ["Twinkle", "twinkle"]

8. Összehangol bármit a helyettesítő karakterekkel

A RegEx .egy helyettesítő karakter, amely bármihez illeszkedik.

let humStr = "I'll hum a song";
let hugStr = "Bear hug";
// Looks for anything with 3 characters beginning with 'hu'let huRegex = /hu./;
humStr.match(huRegex); // Returns ["hum"]
hugStr.match(huRegex); // Returns ["hug"]

9. Párosítson egyetlen karaktert több lehetőséggel

Bármely karakter illesztése jó, de mi van, ha az egyezést előre definiált karakterkészletre akarjuk korlátozni? Megtehetjük []a RegEx-en belüli használatával .

Ha van /b[aiu]g/, ez azt jelenti, hogy meg tudjuk egyezni a „táskát”, a „nagyot” és a „hibát”.

Ha az összes magánhangzót ki akarjuk vonni egy mondatból, akkor ezt megtehetjük a RegEx segítségével.

let quoteSample = "Beware of bugs in the above code; I have only proved it correct, not tried it.";
let vowelRegex = /[aeiou]/ig;
let result = quoteSample.match(vowelRegex);

10. Meccs az ábécé betűivel

De mi van, ha egy betűtartományt akarunk egyeztetni? Persze, tegyük meg.

let quoteSample = "The quick brown fox jumps over the lazy dog.";
// We can match all the letters from 'a' to 'z', ignoring casing. let alphabetRegex = /[a-z]/ig;
let result = quoteSample.match(alphabetRegex);

11. Egyezik az ábécé számai és betűi

A betűk jók, de mi van, ha számokat is szeretnénk?

let quoteSample = "Blueberry 3.141592653s are delicious.";
// match numbers between 2 and 6 (both inclusive), // and letters between 'h' and 's'. let myRegex = /[2-6h-s]/ig;
let result = quoteSample.match(myRegex);

12. Egyetlen karakterek egyeztetése nincs megadva

Néha könnyebb megadni azokat a karaktereket, amelyeket nem akar megnézni. Ezeket „Negated Characters” -nek hívják, és a RegEx-ben ezt megteheti ^.

let quoteSample = "3 blind mice.";
// Match everything that is not a number or a vowel. let myRegex = /[^0-9aeiou]/ig;
let result = quoteSample.match(myRegex);// Returns [" ", "b", "l", "n", "d", " ", "m", "c", "."]

13. Egy vagy többször előforduló karakterek egyeztetése

Ha egy vagy többször előforduló karaktereket szeretne egyeztetni, használhatja +.

let difficultSpelling = "Mississippi";
let myRegex = /s+/g;
let result = difficultSpelling.match(myRegex);// Returns ["ss", "ss"]

14. Nulla vagy többször előforduló karakterek egyeztetése

Van egy *RegEx kvantor is. Ez egy karakter akár 0 előfordulásának felel meg. Miért lehet ez hasznos? Legtöbbször általában más karakterekkel kombinálva. Nézzünk meg egy példát.

let soccerWord = "gooooooooal!";
let gPhrase = "gut feeling";
let oPhrase = "over the moon";
// We are trying to match 'g', 'go', 'goo', 'gooo' and so on. let goRegex = /go*/;
soccerWord.match(goRegex); // Returns ["goooooooo"]
gPhrase.match(goRegex); // Returns ["g"]
oPhrase.match(goRegex); // Returns null

15. Keresse meg a Lazy Matching karaktereket

Néha a mintaegyezéseknek több eredménye is lehet. Tegyük fel például, hogy mintát keresek egy szóban, titanicés az egyező értékeimnek „t” -nel kell kezdődniük, és egy „i” -vel kell végződniük. A lehetséges eredményeim a „titani” és a „ti”.

Ezért van a RegEx fogalma a „Kapzsi meccs” és a „Lusta meccs” kifejezésről.

Kapzsi mérkőzés találja a lehető leghosszabb mérkőzés a húr, amely illeszkedik a reguláris kifejezéseket, ez egy alapértelmezett RegEx mérkőzés:

let string = "titanic";
let regex = /t[a-z]*i/;
string.match(regex);// Returns ["titani"]

A Lazy match megtalálja a lehető legrövidebb illesztést a karaktersorozatból, amely illeszkedik a RegEx mintához, és használatához használnunk kell ?:

let string = "titanic";
let regex = /t[a-z]*?i/;
string.match(regex);// Returns ["ti"]

16. Keressen egy vagy több bűnözőt egy vadászat során

Most nézzünk meg egy RegEx kihívást. Meg kell találnunk az összes bűnözőt ('C') a tömegben. Tudjuk, hogy mindig együtt maradnak, és írnia kell egy RegEx-et, amely megtalálja őket.

let crowd = 'P1P2P3P4P5P6CCCP7P8P9';
let reCriminals = /./; // Change this line
let matchedCriminals = crowd.match(reCriminals);

Megtalálhatom, ahogy végigmegyek a megoldáson ebben a Scrimba szereposztásban.

17. Meccs kezdő húrminták

A RegEx lehetővé teszi olyan minták egyeztetését is, amelyek csak a karakterlánc elején vannak. Már beszéltünk ^egy tagadó készlet létrehozásáról. Ugyanezt a szimbólumot használhatjuk arra, hogy csak a karakterlánc elején találjunk egyezést .

let calAndRicky = "Cal and Ricky both like racing.";
// Match 'Cal' only if it's at the beginning of a string. let calRegex = /^Cal/;
let result = calRegex.test(calAndRicky); // Returns true
let rickyAndCal = "Ricky and Cal both like racing.";
let result = calRegex.test(rickyAndCal); // Returns false

18. Egyezés befejező karakterláncok

Mi a helyzet a minta illesztésével a karakterlánc végén? Használhatjuk $arra.

let caboose = "The last car on a train is the caboose";
// Match 'caboose' if it's at the end of a string.let lastRegex = /caboose$/;
let result = lastRegex.test(caboose); // Returns true

19. Illessze össze az összes betűt és számot

Korábban a 10. és 11. részben megmutattam, hogyan tudjuk összehangolni a betűk és számok tartományát. Ha arra kértem, hogy írjon egy RegEx-et, amely megfelel az összes betűnek és számnak, és figyelmen kívül hagyja az esetüket, akkor valószínűleg valami hasonlót írt volna, /[a-z0-9]/giés ez pontosan így van. De ez egy kicsit túl hosszú.

A RegEx rendelkezik úgynevezett „Gyorsírásos karakterosztályokkal” , ami alapvetően a közös RegEx kifejezés rövidítése. Az összes betű és szám egyezéséhez, amelyet használhatunk, \wés _bónuszként aláhúzást is kapunk .

let quoteSample = "The five boxing wizards jump quickly.";
// Same as /[a-z0-9_]/gi to match a-z (ignore case), 0-9 and _let alphabetRegexV2 = /\w/g;
// The length of all the characters in a string// excluding spaces and the period. let result = quoteSample.match(alphabetRegexV2).length;
// Returns 31

20. Mindent egyezzen a betűk és számok kivételével

Ha az ellenkezőjét akarjuk megtenni, és mindent összeillesztünk, ami nem betű vagy szám (az aláhúzást is kizárjuk _), használhatjuk\W

let quoteSample = "The five boxing wizards jump quickly.";
// Match spaces and the periodlet nonAlphabetRegex = /\W/g;
let result = quoteSample.match(nonAlphabetRegex).length;
// Returns 6

21. Minden szám egyeztetése

Ok, mi van akkor, ha csak számokat akarsz? Van erre gyorsírásos karakterosztály? Persze, hogy van \d.

let numString = "Your sandwich will be $5.00";
// Match all the numberslet numRegex = /\d/g;
let result = numString.match(numRegex).length; // Returns 3

22. Illessze az összes nem számot

Szeretné az ellenkezőjét, és egyezne az összes nem számmal? Használat\D

let numString = "Your sandwich will be $5.00";
// Match everything that is not a numberlet noNumRegex = /\D/g;
let result = numString.match(noNumRegex).length; // Returns 24

23. Korlátozza a lehetséges felhasználóneveket

Eddig jó! Jól sikerült, hogy idáig eljutottam. A RegEx bonyolult lehet, mivel nem ez a legkönnyebben olvasható kódolási mód. Most nézzünk meg egy nagyon valós példát, és készítsünk egy felhasználónév-ellenőrzőt. Ebben az esetben 3 követelménye van:

  • Ha vannak számok, akkor azoknak a végén kell lenniük.
  • A betűk lehetnek kis- és nagybetűk.
  • Legalább két karakter hosszú. A kétbetűs neveknek nem lehet számuk.

Próbáld meg megoldani ezt egyedül, és ha nehéznek találod, vagy csak le akarod ellenőrizni a választ, nézd meg a megoldásomat.

24. Match szóköz

Össze tudjuk-e állítani az összes szóközt? Természetesen erre is használhatunk gyorsírást, és az is\s

let sample = "Whitespace is important in separating words";
// Match all the whitespaceslet countWhiteSpace = /\s/g;
let result = sample.match(countWhiteSpace);
// Returns [" ", " ", " ", " ", " "]

25. Illessze a szóköz nélküli karaktereket

Meg tudja tippelni, hogyan illeszthető össze az összes nem fehér szóköz karakter? Jól sikerült, ez van \S!

let sample = "Whitespace is important in separating words";
// Match all non-whitespace characterslet countWhiteSpace = /\S/g;
let result = sample.match(countWhiteSpace);

26. Adja meg a mérkőzések felső és alsó számát

A „Mennyiségspecifikátorok” segítségével megadhatja a minta egyezésének alsó és felső számát . Használhatók {}például szintaxissal, {3,6}ahol 3az alsó és 6a felső határ illesztendő.

let ohStr = "Ohhh no";
// We want to match 'Oh's that have 3-6 'h' characters in it. let ohRegex = /Oh{3,6} no/;
let result = ohRegex.test(ohStr); // Returns true

27. Csak az alacsonyabb számú mérkőzést adja meg

Amikor csak az alsó határt akarjuk megadni, akkor megtehetjük úgy, hogy kihagyjuk a felső határt, például legalább három írható karakter egyezéséhez {3,}. Vegyük észre, hogy még mindig vesszőre van szükségünk, még akkor is, ha nem adjuk meg a felső határt.

let haStr = "Hazzzzah";
// Match a pattern that contains at least for 'z' characterslet haRegex = /z{4,}/;
let result = haRegex.test(haStr); // Returns true

28. Adja meg a mérkőzések pontos számát

Az előző részben említettem, hogy vesszőre van szükségünk, {3,}amikor csak az alsó határt adjuk meg. Ennek oka az, ha {3}vessző nélkül írsz , ez azt jelenti, hogy pontosan 3 karaktert akarsz egyeztetni.

let timStr = "Timmmmber";
// let timRegex = /Tim{4}ber/;
let result = timRegex.test(timStr); // Returns true

29. Ellenőrizze az Összes vagy Nincs lehetőséget

Van, amikor érdemes megadnia egy karakter lehetséges létezését a mintájában. Amikor egy betű vagy egy szám nem kötelező, és ezt használnánk ?.

// We want to match both British and American English spellings // of the word 'favourite'
let favWord_US = "favorite";let favWord_GB = "favourite";
// We match both 'favorite' and 'favourite' // by specifying that 'u' character is optionallet favRegex = /favou?rite/; // Change this line
let result1 = favRegex.test(favWord_US); // Returns truelet result2 = favRegex.test(favWord_GB); // Returns true

30. Pozitív és negatív tekintet

A „ Lookaheads ” olyan minták, amelyek arra szólítják a JS-t, hogy nézzen a fejére, hogy ellenőrizze a további mintákat. Hasznosak, ha több mintát próbál meg keresni ugyanazokban a karakterláncokban. Kétféle nézőfej van - pozitív és negatív.

A pozitív megjelenés ?=szintaxist használ

let quit = "qu";
// We match 'q' only if it has 'u' after it. let quRegex= /q(?=u)/;
quit.match(quRegex); // Returns ["q"]

A negatív megjelenés ?!szintaxist használ

let noquit = "qt";
// We match 'q' only if there is no 'u' after it. let qRegex = /q(?!u)/;
noquit.match(qRegex); // Returns ["q"]

31. A minták újrafelhasználása a Rögzítési csoportok használatával

Képzeljük el, hogy meg kell ismételnünk egy ismétlődő mintát.

let repeatStr = "regex regex";
// We want to match letters followed by space and then letterslet repeatRegex = /(\w+)\s(\w+)/;
repeatRegex.test(repeatStr); // Returns true

Ahelyett, hogy megismételnénk (\w+)a végén, megadhatjuk a RegEx-nek, hogy ismételje meg a mintát a használatával \1. Tehát ugyanaz, mint fent, újból így írható:

let repeatStr = "regex regex";
let repeatRegex = /(\w+)\s\1)/;
repeatRegex.test(repeatStr); // Returns true

32. A Capture Groups használatával keressen és cseréljen

Ha találunk egy gyufát, néha hasznos helyettesíteni valamivel. Használhatunk erre replace()módszert.

let wrongText = "The sky is silver.";
let silverRegex = /silver/;
wrongText.replace(silverRegex, "blue");
// Returns "The sky is blue."

33. Távolítsa el a szóközt az elejéről és a végéről

Itt egy kis kihívás az Ön számára. Írjon egy RegEx-et, amely eltávolítaná a karakterlánc körüli szóközt.

let hello = " Hello, World! ";
let wsRegex = /change/; // Change this line
let result = hello; // Change this line

Ha elakad vagy csak meg akarja nézni a megoldásomat, nyugodtan nézze meg a Scrimba stábját, ahol megoldom ezt a kihívást.

34. Következtetés

Gratulálunk! Befejezte ezt a tanfolyamot! Ha tovább szeretne tanulni, bátran fizesse meg ezt a YouTube lejátszási listát, amely sok JavaScript-projektet hozhat létre.

Tanulj tovább és köszönöm az olvasást!

Most már készen áll a regex golfozásra. ?