A reguláris kifejezés (vagy regex) karakterek sorozata, amellyel egy string bizonyos elemeit célozhatjuk meg és alakíthatjuk. Segítségével például:
💡 A JavaScript regex-motorja az ECMA-262 szabvány része. Ez azt jelenti, hogy nem kell a böngészőnként eltérő kompatibilitással törődnöd.
A JavaScriptben a reguláris kifejezést többnyire a /pattern/modifiers formátumban írjuk le.
Kétféleképpen hozhatunk létre reguláris kifejezést:
const regex = /[a-z]/;
const regex = new RegExp('[a-z]');
Mindkét esetben a JavaScript egy objektumot hoz létre a regexből. Azt javasoljuk, hogy alapértelmezésként a literál jelölést használd, mert így a minta változtathatatlan lesz.
A RegExp konstruktort olyan esetekben érdemes használni, amikor a regex változni fog, vagy még nem ismerjük (például egy bemenet esetén).
A reguláris kifejezéseknek vannak opcionális szuperképességei, az úgynevezett flags, amelyek további funkciókat tesznek lehetővé.
Néhány a széles körben használtak közül:
/g - Globális keresés/i - Kis- és nagybetűre érzéketlen/m - Többsoros keresésÍme egy egyszerű példa:
const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);
=> // ["Home", "home"]
A g karakterrel egy string összes lehetséges egyezését bejárhatjuk. E funkció nélkül a JavaScript csak az első Home egyezést emelte volna ki.
A kis- és nagybetűre érzéketlen /i jelző rugalmasabbá tesz minket a minta keresésekor. Így nem számít, hogy amit keresünk, UPPERCASE vagy lowercase formában szerepel-e.
A RegExp konstruktor használatakor a jelzők hozzáadásának szintaxisa eltér.
let regex = /[a-z]/gi; // literal notation
let regex = new RegExp('[a-z]', 'gi'); // constructor with string pattern as first argument
let regex = new RegExp(/[a-z]/, 'gi'); // constructor with regular expression literal as first argument (Starting with ECMAScript 6)
Amikor a reguláris kifejezéseket a JavaScript beépített függvényeivel kombináljuk, hatékony módjait kapjuk a stringek kezelésének és az adatok kinyerésének.
Íme néhány a regexszel leggyakrabban együtt használt függvény közül.
A test() metódus egy reguláris kifejezés és egy megadott string közötti egyezést keres. Igaz vagy hamis értékkel tér vissza.
const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);
console.log(result);
// => true
A match() metódussal egy hasznos tömböt kapunk, amelynek tartalma a megtalált egyezések meglététől vagy hiányától függ.
Így egyszerre tudunk keresni és információt kinyerni bármely stringből. Például:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex1 = /someone/;
const regex2 = /happy/;
funnyQuote.match(regex1);
// => ["someone", index: 11, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined]
funnyQuote.match(regex2);
// => null
Amikor jelen van a globális keresés /g jelző, a metódus a hasznos információkkal, például az indexszel vagy az inputtal együtt járó egyetlen egyezés helyett a tömbben megjelenített összes előfordulást adja vissza:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex3 = /if/gi;
funnyQuote.match(regex3);
// => ["If", "if"];
A JavaScript replace() metódusa lehetővé teszi, hogy egy adott stringen belül megkeressünk egy értéket, és lecseréljük egy kívánt új értékre.
string.replace(searchValue, newValue);
A keresési minta lehet egyetlen string vagy egy reguláris kifejezés.
let string = 'I like dogs!';
let result = string.replace('dogs', 'cats');
let string = 'I would love to travel to Japan';
let result = string.replace(/Japan/g, 'Hawaii');
Sőt, a csere helyére függvényt is adhatunk, hogy minden értéket tovább alakítsunk.
let text = 'Say hello to the chatbot.';
let result = text.replace(/chatbot|hello/gi, function (word) {
return word.toUpperCase();
});
// => "Say HELLO to the CHATBOT"
A JavaScript split() metódusa a stringek reguláris kifejezésekkel való használatának és kezelésének egy másik módját mutatja be.
Így a regexet arra használjuk, hogy egy adott stringet egy felismert minta alapján felosszunk, például str.split(/[,.\s]/). Ez a minta lesz a separator.
const str = 'hello,user.how are.you';
const result = str.split(/[,.\s]/);
console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']
Felvettek reguláris kifejezések szakértőjeként egy olyan céghez, amelyik egy Chatbotot fejleszt.
A fejlesztés nagyon kezdeti szakaszában jár, ezért az a küldetésed, hogy reguláris kifejezésekkel javítsd a Chatbot képességét a természetes nyelv megértésére és előállítására.
A Chatbot nemcsak okos, hanem hűséges segítő is.
Ahhoz, hogy kérdezzen valamit a Chatbottól, a felhasználónak a parancs első helyén ki kell mondania a „Chatbot” szót.
Nem számít, hogy a kulcsszó csupa nagybetűvel vagy kisbetűvel szerepel-e. Itt a szó pozíciója a fontos.
Valósítsd meg az isValidCommand() függvényt, amely segít a Chatbotnak felismerni, mikor ad parancsot a felhasználó.
isValidCommand("Chatbot, play a song from the 80's.";
// => True
isValidCommand("Hey Chatbot, where is the closest pharmacy?";
// => False
isValidCommand("CHATBOT, do you have a solution for this challenge?";
// => True
A Chatbot nehezen érti meg, hogyan használják az emberek az emojikat az érzelmeik kifejezésére.
Amikor a Chatbot üzeneteket kap a felhasználóktól, minden emoji „emoji” formában, utána a hozzá tartozó id számmal jelenik meg.
Valósítsd meg a removeEmoji() metódust, amely egy stringet kap, és eltávolítja az összes emoji titkosítását az egész üzenetből.
Azokat a sorokat, amelyek nem tartalmaznak emojit, változatlanul kell visszaadni.
Csak az emoji szövegét távolítsd el. Ne próbáld módosítani a szóközöket.
Ennél a konkrét feladatnál konstruktor szintaxist használj a reguláris kifejezés létrehozásához.
removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames it's one of my hobbies"
Mivel a Chatbot funkciói mobilalkalmazásba is letölthetők, a felhasználó a beszélgetés során várhatóan megadja a telefonszámát.
A probléma az, hogy a Chatbot csak egy adott formátumú számot tud elolvasni és ellenőrizni.
Ha a szám érvényes (megfelel a reguláris kifejezés által meghatározott karaktersorozatnak), a Chatbot egy üzenettel válaszol, amelyben megköszöni a felhasználónak, és megerősíti a számot. Ha a szám érvénytelen, a függvény tájékoztatja a felhasználót, hogy a telefonszám nem érvényes.
A várt formátum: (+##) ###-###-###
checkPhoneNumber('(+34) 659-771-594');
// => "Thanks! You can now download me to your phone."
checkPhoneNumber('659-771-594');
// => "Oops, it seems like I can't reach out to 659-771-594"
A Chatbot igazán kíváncsi szoftver. Bár ő maga is tud keresni az interneten egy-egy témában, szeret megkérdezni a felhasználóktól menő weboldalakat vagy URL-eket, hogy releváns információkat találjon.
Példa egy beszélgetésre:
Valósítsd meg a getURL() függvényt, amely egy tömbbel tér vissza, amelyben csak az egyes weboldalak linkjei szerepelnek. Nagyon bonyolult lenne olyan regexet írni, amely bármilyen URL-t felismer, de a Chatbotnak csak az egyszerű URL-eket kell elolvasnia. Ennél a feladatnál az URL szavak olyan sorozata, amelyeket "." választ el egymástól.
getURL(
'I learned a lot from exercism.org and developer.mozilla.org, but I found ts39.es very boring!',
);
// => ["exercism.org", "developer.mozilla.org", "ts39.es"];
Ahhoz, hogy eltárolja azoknak az adatait, akikkel beszélgetett, a Chatbot a felhasználó profiljából ebben a formában tudja kiolvasni a teljes nevet: „smith, john”.
Így szeretnénk, hogy a Chatbot igazán udvarias legyen, és jó benyomást keltsen.
Írd meg a niceToMeetYou() függvényt, amely egy stringet kap a felhasználó teljes nevével, és a „Nice to meet you, John Smith” stringet adja vissza.
Tanulási célból a függvényt a reguláris kifejezések egyik helyettesítő metódusával valósítsd meg.
let str = 'Smith, John';
niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) JavaScript nyelvet 37 fogalom159 feladat segítségével, valódi emberi mentorálással, mindez ingyen.