Opi säännöllisiä lausekkeita tällä ilmaisella kurssilla

"Jotkut ihmiset kohtaavat ongelman, ajattelevat:" Tiedän, käytän säännöllisiä lausekkeita ". Nyt heillä on kaksi ongelmaa. " -Jamie Zawinski

Joillekin ihmisille säännöllisten lausekkeiden käyttö voi olla ongelma. Mutta sen ei tarvitse olla ongelma sinulle. Tämä artikkeli on täydellinen säännöllisten lausekkeiden kurssi.

1. Esittely

Säännöllisiä lausekkeita tai vain RegEx-tiedostoja käytetään melkein kaikilla ohjelmointikielillä määrittelemään hakumalli, jota voidaan käyttää merkkijonossa olevien asioiden etsimiseen.

Olen kehittänyt Scrimba.com -sivustolla ilmaisen, täydellisen videokurssin säännöllisten lausekkeiden perusteiden opettamiseksi.

Tämä artikkeli sisältää kurssin kirjallisessa muodossa. Mutta jos haluat mieluummin katsella videoversiota interaktiivisilla oppitunneilla, voit tarkistaa sen Scrimbasta. Tämän artikkelin osiot vastaavat Scimba-kurssin osioita.

Tämä kurssi seuraa RegEx-opetussuunnitelmaa osoitteessa freeCodeCamp.org. Voit tarkistaa sen koodauksen haasteista ja ansaita sertifikaatin.

Nämä oppitunnit keskittyvät RegExin käyttöön JavaScriptissä, mutta periaatteita sovelletaan moniin muihin ohjelmointikieliin, joita haluat käyttää. Jos et vielä tiedä perus JavaScriptiä, voi olla hyödyllistä, jos peität sen ensin ensin. Minulla on myös JavaScript-peruskurssi, jota voit käyttää Scrimban ja freeCodeCamp.org-YouTube-kanavalla.

Joten aloitetaan! Säästät päivän hetkessä. ?

2. Testimenetelmän käyttö

Jotta osia merkkijonoista voidaan sovittaa RegEx: n avulla, meidän on luotava malleja, jotka auttavat sinua tekemään vastaavan. Voimme osoittaa, että jotain on säännöllisellä lausekkeella laittamalla kuvio välillä viiltää /, kuten niin /pattern-we-want-to-match/.

Katsotaanpa esimerkkiä:

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

Huomaa, kuinka käytämme /the/osoittamaan, että etsimme "the" -symboleita sentence.

Voimme käyttää RegEx- test()menetelmää kertoaksemme, esiintyykö merkkijonossa mallia vai ei.

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

3. Ottele kirjaimelliset jouset

Löydetään nyt 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);

Huomaa, että tässä esimerkissä waldoRegexkirjainkoko on merkitsevä, joten jos kirjoittaisimme /waldo/pienillä kirjaimilla 'w', niin meidän resultolisi väärä.

4. Yhdistä kirjaimellinen merkkijono erilaisiin mahdollisuuksiin

RegExillä on myös ORoperaattori, joka on |merkki.

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. Ohita tapaus sovitettaessa

Toistaiseksi olemme tarkastelleet malleja, kun kirjainten tapaus oli tärkeä. Kuinka voimme tehdä RegEx-kuvioistamme kirjainkoon erottamattomia?

Välttääksemme kirjainkoon voimme tehdä sen lisäämällä ilipun mallin loppuun, kuten niin /some-pattern/i.

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

6. Pura ottelut

Kun haluamme poimia vastaavan arvon, voimme käyttää match()menetelmää.

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. Löydä enemmän kuin ensimmäinen ottelu

Nyt kun tiedämme, kuinka yksi arvo puretaan, ja on myös mahdollista purkaa useita arvoja glipun avulla

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

Voimme myös yhdistää glipun lipun kanssa ipurkamaan useita otteluita ja jättämään huomiotta kotelon.

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. Yhdistä kaikki yleismerkkijaksoon

RegEx .on jokerimerkki, joka sopisi mihin tahansa.

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. Yhdistä yksi merkki usealla mahdollisuudella

Minkä tahansa merkin yhdistäminen on mukavaa, mutta entä jos haluamme rajoittaa haun ennalta määriteltyihin merkistöihin? Voimme tehdä sen käyttämällä []RegEx-järjestelmää.

Jos meillä on /b[aiu]g/, se tarkoittaa, että voimme sovittaa "laukku", "iso" ja "vika".

Jos haluamme poimia kaikki vokaalit lauseesta, voimme tehdä sen RegExillä.

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. Aakkoset

Mutta entä jos haluamme sovittaa useita kirjeitä? Toki, teemme sen.

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. Ottelunumerot ja aakkoset

Kirjaimet ovat hyviä, mutta entä jos haluamme myös numeroita?

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. Yhden merkin vastaavuus ei ole määritelty

Joskus on helpompaa määrittää merkkejä, joita et halua katsella. Näitä kutsutaan Negated Charactersiksi ja RegExissä voit tehdä sen käyttämällä ^.

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. Yhdistä hahmot, jotka esiintyvät yhden tai useamman kerran

Jos haluat sovittaa yhteen tai useampaan kertaan esiintyviä merkkejä, voit käyttää niitä +.

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

14. Yhdistä merkit, jotka esiintyvät nolla tai useammin

On myös *RegEx-kvantisoija. Tämä vastaa jopa 0 merkin esiintymistä. Miksi tämä voi olla hyödyllistä? Suurimman osan ajasta se on yleensä yhdessä muiden merkkien kanssa. Katsotaanpa esimerkkiä.

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. Löydä hahmoja, joissa on Lazy Matching

Joskus kuviotuloksillasi voi olla useampi kuin yksi tulos. Oletetaan esimerkiksi, että etsin kuviota sanasta, titanicja vastaavien arvojeni täytyy alkaa 't': llä ja päättyä i: llä. Mahdolliset tulokset ovat 'titani' ja 'ti'.

Siksi RegExillä on käsitteet 'ahne ottelu' ja 'laiska ottelu'.

Ahne ottelu löytää pisin mahdollinen ottelu merkkijonon, joka sopii RegEx kuvio, tämä on oletusarvo RegEx ottelu:

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

Laiska ottelu löytää lyhin mahdollinen ottelu merkkijonon, joka sopii RegEx kuvion ja käyttää sitä meidän on käytettävä :?

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

16. Löydä yksi tai useampi rikollinen metsästyksestä

Katsotaan nyt RegEx-haastetta. Meidän on löydettävä kaikki rikolliset ('C') joukosta. Tiedämme, että he pysyvät aina yhdessä ja sinun on kirjoitettava RegEx, joka löytää heidät.

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

Löydät minut kävelemässä ratkaisun läpi tässä Scrimba-näyttelijässä.

17. Ottelun alku merkkijonot

RegEx antaa sinun myös sovittaa malleja, jotka ovat vasta merkkijonon alussa. Olemme jo puhuneet ^negatiivisen sarjan luomisesta. Voimme käyttää samaa symbolia vastaavuuden löytämiseen vain merkkijonon alusta.

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. Ottelun loppumerkkijonokuviot

Entä jos sovitat mallin merkkijonon loppuun? Voimme käyttää $sitä.

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. Yhdistä kaikki kirjaimet ja numerot

Aiemmin osissa 10 ja 11 kerroin sinulle, kuinka voimme sovittaa kirjain- ja numeroalueet. Jos pyysin sinua kirjoittamaan RegEx, joka vastaa kaikkia kirjaimia ja numeroita, ja jättää huomiotta niiden tapaukset, olet todennäköisesti kirjoittanut jotain /[a-z0-9]/gija se on aivan oikein. Mutta se on vähän liian pitkä.

RegExillä on ns . Lyhytmerkkiluokka , joka on pohjimmiltaan yleisen RegEx-lausekkeen lyhenne. Kaikkien kirjaimien ja numeroiden sovittamiseksi voimme käyttää \wmyös alleviivaa _bonuksena.

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. Yhdistä kaikki paitsi kirjaimet ja numerot

Jos haluamme tehdä päinvastoin ja sovittaa kaiken, mikä ei ole kirjainta tai numeroa (jätä myös alaviiva pois _), voimme käyttää\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. Yhdistä kaikki numerot

Ok, entä jos haluat vain numeroita? Onko sille lyhytmerkkiluokka? Toki se on \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. Yhdistä kaikki muut kuin numerot

Haluatko päinvastoin ja sovitat kaikki ei-numerot? Käyttää\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. Rajoita mahdollisia käyttäjänimiä

Toistaiseksi niin hyvä! Hyvin tehty, jotta pääsisimme tähän. RegEx voi olla hankala, koska se ei ole helpoin luettavissa oleva tapa koodata. Tarkastellaan nyt hyvin tosielämän esimerkkiä ja tehdään käyttäjätunnuksen vahvistaja. Tässä tapauksessa sinulla on 3 vaatimusta:

  • Jos numeroita on, niiden on oltava lopussa.
  • Kirjaimet voivat olla pieniä ja isoja.
  • Vähintään kaksi merkkiä pitkä. Kaksikirjaimisilla nimillä ei voi olla numeroita.

Yritä ratkaista tämä itse ja jos sinulla on vaikeuksia tai haluat vain tarkistaa vastauksen, tutustu ratkaisuuni.

24. Ottele välilyönti

Voimmeko sovittaa kaikki välilyönnit? Tietysti voimme käyttää siihen myös lyhennettä ja se on\s

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

25. Yhdistä ei-välilyönnin merkit

Voitteko arvata, kuinka sovittaa kaikki muut kuin välilyönnin merkit? Hyvin tehty, se on \S!

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

26. Määritä ylempi ja alempi otteluiden määrä

Voit määrittää alemman ja ylemmän kuvion vastaavuuden määrällä 'Määrälaskurit'. Niitä voidaan käyttää esimerkiksi {}syntaksin kanssa {3,6}, missä 3on 6sovitettava ala- ja yläraja.

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. Määritä vain pienin otteluiden määrä

Kun haluamme määrittää vain alarajan, voimme tehdä sen jättämällä pois ylärajan, esimerkiksi vastaamaan vähintään kolmea merkkiä, jotka voimme kirjoittaa {3,}. Huomaa, että tarvitsemme edelleen pilkun, vaikka emme määritä ylärajaa.

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

28. Määritä tarkka otteluiden määrä

Edellisessä osassa mainitsin, että tarvitsemme pilkun, {3,}kun määritämme vain alarajan. Syynä on, kun kirjoitat {3}ilman pilkua, se tarkoittaa, että etsit täsmälleen 3 merkkiä.

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

29. Tarkista kaikki tai Ei mitään

Joskus haluat ehkä määrittää mahdollisen merkin olemassaolon kuviossasi. Kun kirjain tai numero on valinnainen ja käytämme ?sitä.

// 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. Positiivinen ja negatiivinen lookahead

" Lookaheads " ovat kuvioita, jotka kertovat JS: lle etsimään tarkistusmalleja pitemmälle. Ne ovat hyödyllisiä, kun yrität etsiä useita malleja samoista merkkijonoista. Siellä on 2 tyyppistä lookaheadia - positiivisia ja negatiivisia.

Positiivinen lookahead käyttää ?=syntaksia

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

Negatiivinen lookahead käyttää ?!syntaksia

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

31. Käytä kuvioita uudelleen sieppausryhmien avulla

Kuvitellaan, että meidän on kaapattava toistuva kuvio.

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

Sen sijaan, (\w+)että toistaisimme lopussa, voimme kertoa RegExille toistamaan mallin käyttämällä \1. Joten sama kuin yllä, voidaan kirjoittaa uudelleen seuraavasti:

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

32. Käytä Sieppaa ryhmiä etsimään ja korvaamaan

Kun löydämme ottelun, on joskus kätevää korvata se jollakin muulla. Voimme käyttää replace()menetelmää siihen.

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

33. Poista välilyönti alusta ja lopusta

Tässä on pieni haaste sinulle. Kirjoita RegEx, joka poistaa kaikki välilyönnit merkkijonon ympäriltä.

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

Jos juutut tai haluat vain tarkistaa ratkaisuni, tutustu Scrimba-näyttelijöihin, joissa ratkaisen tämän haasteen.

34. Päätelmä

Onnittelut! Olet suorittanut tämän kurssin! Jos haluat jatkaa oppimista, voit vapaasti tarkistaa tämän YouTube-soittolistan, jossa on paljon luotavia JavaScript-projekteja.

Jatka oppimista ja kiitos lukemisesta!

Olet nyt valmis pelaamaan regex-golfia. ?