de Beau Carnes

Conţinut

Aflați expresii regulate cu acest curs gratuit

Aflati expresii regulate cu acest curs gratuit

„Unii oameni, când se confruntă cu o problemă, cred că„ știu, voi folosi expresii regulate ”. Acum au două probleme. ” -Jamie Zawinski

Pentru unii oameni, utilizarea expresiilor regulate poate fi o problemă. Dar nu trebuie să fie o problemă pentru tine. Acest articol este un curs complet despre expresii regulate.

1. Introducere

Expresiile regulate, sau doar RegEx, sunt utilizate în aproape toate limbajele de programare pentru a defini un model de căutare care poate fi folosit pentru a căuta lucruri într-un șir.

Am dezvoltat un curs video gratuit, complet pe Scrimba.com pentru a preda elementele de bază ale expresiilor regulate.

Acest articol conține cursul în formă scrisă. Dar dacă preferați să vizionați versiunea video cu lecții interactive, o puteți verifica pe Scrimba. Secțiunile din acest articol corespund secțiunilor din cursul Scimba.

Acest curs urmează împreună cu RegEx curriculum la Routech.org. Puteți verifica acest lucru pentru provocări de codificare și pentru a obține un certificat.

Aceste lecții se concentrează pe utilizarea RegEx în JavaScript, dar principiile se aplică în multe alte limbaje de programare pe care ați alege să le utilizați. Dacă nu cunoașteți deja JavaScript de bază, ar putea fi util dacă îl acoperiți mai întâi. De asemenea, am un curs de bază JavaScript pe care îl puteți accesa Scrimba și pe canalul YouTube Routech.org.

Deci sa începem! Veți economisi ziua în cel mai scurt timp. ?

1611256869 847 Aflati expresii regulate cu acest curs gratuit
Din https://xkcd.com/208/

2. Utilizarea metodei de testare

Pentru a potrivi părți ale șirurilor folosind RegEx, trebuie să creăm modele care să vă ajute să faceți această potrivire. Putem indica faptul că ceva este un model RegEx punând modelul între bare oblice /, ca astfel /pattern-we-want-to-match/.

Să vedem un exemplu:

// 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/

Observați cum folosim /the/ pentru a indica faptul că căutăm „cel” în al nostru sentence.

Putem folosi RegEx test() metoda de a spune dacă un model este prezent într-un șir sau nu.

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

3. Potriviți șirurile literale

Să-l găsim acum pe Waldo.

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);

Rețineți că în acest exemplu waldoRegex este sensibil la majuscule, deci dacă ar fi să scriem /waldo/ cu o minusculă „w”, apoi a noastră result ar fi fals.

4. Potriviți un șir literal cu posibilități diferite

RegEx are, de asemenea OR operator care este | caracter.

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. Ignorați majusculele în timpul potrivirii

Până în prezent, ne-am uitat la modele atunci când cazul literelor a contat. Cum putem face ca modelele noastre RegEx să nu fie sensibile la majuscule și minuscule?

Pentru a ignora cazurile, o putem face adăugând i steag la sfârșitul unui model, așa /some-pattern/i.

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

6. Extrageți potriviri

Când vrem să extragem valoarea potrivită, putem folosi match() metodă.

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. Găsiți mai mult decât primul meci

Acum, când știm cum să extragem o valoare și este, de asemenea, posibil să extragem mai multe valori folosindg steag

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

Putem combina șig steag cui steag, pentru a extrage mai multe potriviri și a ignora carcasa.

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. Potriviți orice cu perioada Wildcard

În RegEx . este un caracter wildcard care s-ar potrivi cu orice.

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. Potriviți un singur personaj cu mai multe posibilități

Potrivirea cu orice caracter este plăcută, dar dacă vrem să restricționăm potrivirea la un set predefinit de caractere? Putem face folosind [] în RegEx.

Daca avem /b[aiu]g/, înseamnă că putem asorta „sac”, „mare” și „bug”.

Dacă vrem să extragem toate vocalele dintr-o propoziție, așa o putem face folosind RegEx.

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. Potriviți literele alfabetului

Dar dacă vrem să potrivim o serie de litere? Sigur, hai să facem asta.

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. Potriviți numerele și literele alfabetului

Literele sunt bune, dar dacă vrem și numere?

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. Potriviți caractere individuale nespecificate

Uneori este mai ușor să specificați caractere pe care nu doriți să le urmăriți. Acestea se numesc „caractere negate” și în RegEx o puteți face folosind ^.

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. Potriviți personajele care apar una sau mai multe ori

Dacă doriți să potriviți un caracter care apare de una sau mai multe ori, puteți utiliza +.

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

14. Potriviți personaje care apar zero sau mai multe ori

Este deasemenea o * Cuantificator RegEx. Acesta se potrivește chiar cu 0 apariții ale unui personaj. De ce ar putea fi util acest lucru? De cele mai multe ori este de obicei în combinație cu alte personaje. Să vedem un exemplu.

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. Găsiți personaje cu potrivire leneșă

Uneori, potrivirile de tipare pot avea mai multe rezultate. De exemplu, să presupunem că caut un model într-un cuvânt titanic iar valorile mele potrivite trebuie să înceapă cu un „t” și să se termine cu un „i”. Posibilele mele rezultate sunt „titani” și „ti”.

Acesta este motivul pentru care RegEx are conceptele „Greedy Match” și „Lazy Match”.

Partidul lacom găsește cel mai lung meci posibil din șirul care se potrivește cu modelul RegEx, acesta este un meci implicit RegEx:

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

Potrivire leneșă găsește cel mai scurt meci posibil a șirului care se potrivește cu modelul RegEx și pentru al utiliza trebuie să îl folosim ?:

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

16. Găsiți unul sau mai mulți infractori într-o vânătoare

Acum să aruncăm o privire la o provocare RegEx. Trebuie să găsim toți infractorii („C”) într-o mulțime. Știm că rămân mereu împreună și trebuie să scrieți un RegEx care să le găsească.

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

Mă găsești plimbându-mă soluția din această distribuție Scrimba.

17. Potriviți tiparele șirurilor de început

RegEx vă permite, de asemenea, să potriviți modele care sunt doar la începutul unui șir. Am vorbit deja despre asta ^ crearea unui set negator. Putem folosi același simbol pentru a găsi o potrivire numai la începutul unui șir.

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. Potrivește tiparele de șiruri de încheiere

Ce zici de potrivirea unui model la sfârșitul unui șir? Putem folosi $ pentru asta.

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. Potriviți toate literele și numerele

Anterior, în părțile 10 și 11, v-am arătat cum putem potrivi game de litere și cifre. Dacă v-aș cere să scrieți un RegEx care să se potrivească cu toate literele și numerele și să le ignorați cazurile, probabil că ați fi scris ceva de genul /[a-z0-9]/gi și exact așa este. Dar este cam prea lung.

RegEx are ceva numit „Clasele de caractere stenografice”, care este în esență o prescurtare pentru expresia comună RegEx. Pentru potrivirea tuturor literelor și numerelor pe care le putem folosi w și primim și subliniere _ asortat ca bonus.

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. Potriviți totul cu excepția literelor și numerelor

Dacă vrem să facem opusul și să potrivim tot ceea ce nu este o literă sau un număr (excludeți, de asemenea, sublinierea _), putem folosi 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. Potriviți toate numerele

Ok, ce zici dacă vrei doar numere? Există o clasă de caractere stenografice pentru asta? Sigur, este 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. Potriviți toate non-numerele

Doriți opusul și să potriviți toate non-numerele? Utilizare 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. Restricționați numele de utilizator posibile

Până acum, bine! Bravo pentru că ai ajuns până aici. RegEx poate fi dificil, deoarece nu este cel mai ușor de citit mod de codare. Să vedem acum un exemplu foarte real și să facem un validator de nume de utilizator. În acest caz aveți 3 cerințe:

  • Dacă există numere, acestea trebuie să fie la sfârșit.
  • Literele pot fi minuscule și majuscule.
  • Cel puțin două personaje. Numele din două litere nu pot avea numere.

Încercați să rezolvați acest lucru pe cont propriu și dacă vă este greu sau doriți doar să verificați răspunsul, verifică soluția mea.

24. Potriviți spațiul alb

Putem să potrivim toate spațiile albe? Desigur, putem folosi și o scurtătură pentru asta și este s

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

25. Potriviți caractere care nu sunt în spațiu alb

Puteți ghici cum să potriviți toate caracterele care nu sunt spațiu alb? Bravo, este S!

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

26. Specificați numărul superior și inferior de meciuri

Puteți specifica numărul inferior și superior de potriviri de tipare cu „Specificatori de cantitate”. Se pot folosi cu {} sintaxă, de exemplu {3,6}, Unde 3 este limita inferioară și 6 este limita superioară care trebuie potrivită.

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. Specificați doar numărul mai mic de meciuri

Când vrem să specificăm doar limita inferioară, o putem face omițând limita superioară, de exemplu pentru a potrivi cel puțin trei caractere pe care le putem scrie {3,}. Observați că avem încă nevoie de virgulă, chiar și atunci când nu specificăm limita superioară.

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

28. Specificați numărul exact de potriviri

În secțiunea anterioară am menționat că avem nevoie de virgulă {3,} când specificăm doar limita inferioară. Motivul este atunci când scrii {3} fără virgulă, înseamnă că căutați să se potrivească exact 3 caractere.

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

29. Verificați pentru Toate sau Niciuna

Există momente în care este posibil să doriți să specificați o posibilă existență a unui personaj în tiparul dvs. Când o literă sau un număr este opțional și am folosi ? pentru asta.

// 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. Lookahead pozitiv și negativ

Uite-capete‘sunt modele care îi spun lui JS să privească în cap pentru a verifica modelele de mai departe. Acestea sunt utile atunci când încercați să căutați mai multe modele în aceleași șiruri. Există 2 tipuri de lookaheads – pozitive și negative.

Utilizări pozitive ale lookahead ?= sintaxă

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

Utilizări negative ale lookahead ?! sintaxă

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

31. Reutilizați modelele folosind grupuri de captură

Să ne imaginăm că trebuie să surprindem un model care se repetă.

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

În loc să repete (w+) la sfârșit putem spune RegEx să repete modelul, folosind 1. Deci, același lucru ca mai sus poate fi scris din nou ca:

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

32. Folosiți Capture Groups pentru a căuta și înlocui

Când găsim o potrivire, uneori este la îndemână să o înlocuim cu altceva. Putem folosi replace() metodă pentru asta.

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

33. Eliminați spațiul alb din Start și End

Iată o mică provocare pentru tine. Scrieți un RegEx care ar elimina orice spațiu alb din jurul șirului.

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

Dacă rămâneți blocat sau doriți doar să verificați soluția mea, nu ezitați să aruncați o privire distribuția Scrimba unde rezolv această provocare.

34. Concluzie

Felicitări! Ai terminat acest curs! Dacă doriți să continuați să aflați mai multe, nu ezitați să faceți plata această listă de redare YouTube, care are o mulțime de proiecte JavaScript pe care le puteți crea.

Continuă să înveți și mulțumesc pentru lectură!

Acum sunteți gata să jucați golf regex. ?

1611256869 22 Aflati expresii regulate cu acest curs gratuit
Din https://xkcd.com/1313/