Kurzusok
/
JavaScript
JavaScript
/
Feladatok
/
Reguláris chatbot
Reguláris chatbot

Reguláris chatbot

Tanulófeladat

Bevezetés

Reguláris kifejezések JavaScriptben

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:

  • Kereshetsz egy szöveget egy stringben
  • Lecserélhetsz részstringeket egy stringben
  • Kinyerhetsz információt egy stringből

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

Hogyan hozzunk létre reguláris kifejezéseket

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:

  1. Reguláris kifejezés literál:
const regex = /[a-z]/;
  1. RegExp konstruktor:
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).

🏴‍☠️ Jelzők

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)

A leggyakrabban használt függvények

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.

Test

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

Match

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"];

Replace

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"

Split

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']

Utasítások

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.

Érvényes parancs ellenőrzése

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

Titkosított emojik eltávolítása

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"

Érvényes telefonszám ellenőrzése

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"

Weboldal linkjének lekérése

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:

  • Chatbot: Szia felhasználó, szeretnék megtanulni JavaScriptben programozni. Ismersz valami menő weboldalt, ahol tanulhatnék?
  • Felhasználó: Sokat tanultam az exercism.org oldalról.

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"];

Köszöntsd a felhasználót

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"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
JavaScript Exercism

Készen állsz elkezdeni a(z) Reguláris chatbot feladatot?

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.