Διαδρομές
/
JavaScript
JavaScript
/
Ασκήσεις
/
Κανονικός Chatbot
Κανονικός Chatbot

Κανονικός Chatbot

Άσκηση εκμάθησης

Εισαγωγή

Κανονικές εκφράσεις στη JavaScript

Μια κανονική έκφραση (ή regex) είναι μια ακολουθία χαρακτήρων που μπορούμε να χρησιμοποιήσουμε για να στοχεύσουμε και να χειριστούμε συγκεκριμένα στοιχεία μέσα σε συμβολοσειρές. Έτσι, μπορούμε:

  • Να αναζητήσουμε ένα κείμενο μέσα σε μια συμβολοσειρά
  • Να αντικαταστήσουμε υποσυμβολοσειρές σε μια συμβολοσειρά
  • Να εξαγάγουμε πληροφορίες από μια συμβολοσειρά

💡 Η γεύση regex της JavaScript είναι μέρος του προτύπου ECMA-262 για τη γλώσσα. Αυτό σημαίνει ότι δεν χρειάζεται να ανησυχείς για συμβατότητα με συγκεκριμένους browser.

Πώς να δημιουργήσεις κανονικές εκφράσεις

Στη JavaScript, μια κανονική έκφραση γράφεται συνήθως στη μορφή /pattern/modifiers.

Υπάρχουν δύο τρόποι για να δημιουργήσεις μια κανονική έκφραση:

  1. Κυριολεκτικό κανονικής έκφρασης:
const regex = /[a-z]/;
  1. Κατασκευαστής RegExp:
const regex = new RegExp('[a-z]');

Και στις δύο περιπτώσεις, η JavaScript δημιουργεί ένα αντικείμενο από την κανονική έκφραση. Συνιστάται να χρησιμοποιείς αμετάβλητα μοτίβα με το κυριολεκτικό ως προεπιλογή.

Ο κατασκευαστής RegExp μπορεί να χρησιμοποιηθεί σε περιπτώσεις όπου η κανονική έκφραση θα αλλάξει ή δεν τη γνωρίζουμε ακόμη (όπως μια είσοδο).

🏴‍☠️ Σημαίες

Οι κανονικές εκφράσεις έχουν προαιρετικές υπερδυνάμεις που ονομάζονται flags και επιτρέπουν επιπλέον λειτουργίες.

Μερικές από τις πιο διαδεδομένες είναι:

  • /g - Καθολική αναζήτηση
  • /i - Χωρίς διάκριση πεζών-κεφαλαίων
  • /m - Αναζήτηση σε πολλές γραμμές

Ορίστε ένα απλό παράδειγμα:

const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);

=> // ["Home", "home"]

Ο χαρακτήρας g μάς επιτρέπει να εντοπίσουμε όλες τις πιθανές αντιστοιχίσεις μέσα σε μια συμβολοσειρά. Χωρίς αυτή τη δυνατότητα, η JavaScript θα είχε εξαγάγει μόνο την πρώτη αντιστοίχιση Home.

Η σημαία /i χωρίς διάκριση πεζών-κεφαλαίων μάς επιτρέπει να είμαστε ευέλικτοι όταν ψάχνουμε ένα μοτίβο. Έτσι, δεν έχει σημασία αν αυτό που ψάχνουμε είναι σε UPPERCASE ή lowercase.

Όταν χρησιμοποιείς τον κατασκευαστή RegExp, η σύνταξη για την προσθήκη σημαιών είναι διαφορετική.

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)

Οι πιο συνηθισμένες συναρτήσεις

Όταν οι κανονικές εκφράσεις συνδυάζονται με τις ενσωματωμένες συναρτήσεις της JavaScript, έχουμε ισχυρούς τρόπους να χειριζόμαστε και να αντλούμε δεδομένα από συμβολοσειρές.

Αυτές είναι μερικές από τις πιο συνηθισμένες συναρτήσεις που χρησιμοποιούνται μαζί με regex.

Test

Η μέθοδος test() εκτελεί αναζήτηση για αντιστοίχιση μεταξύ μιας κανονικής έκφρασης και μιας συγκεκριμένης συμβολοσειράς. Επιστρέφει αληθής ή ψευδής.

const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);

console.log(result);

// => true

Match

Με τη μέθοδο match() παίρνουμε έναν χρήσιμο πίνακα του οποίου τα περιεχόμενα εξαρτώνται από την παρουσία ή την απουσία των αντιστοιχίσεων που βρέθηκαν.

Έτσι, μπορούμε και να αναζητήσουμε και να εξαγάγουμε πληροφορίες από οποιαδήποτε συμβολοσειρά. Για παράδειγμα:

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

Όταν υπάρχει η σημαία καθολικής αναζήτησης /g, αντί να πάρουμε μόνο τη μία αντιστοίχιση μαζί με χρήσιμες πληροφορίες όπως η θέση ή η είσοδος, η μέθοδος επιστρέφει όλες τις εμφανίσεις που προβάλλονται στον πίνακα:

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

Η μέθοδος replace() στη JavaScript μάς επιτρέπει να αναζητήσουμε μια τιμή μέσα σε μια δεδομένη συμβολοσειρά και να την αντικαταστήσουμε με μια επιθυμητή νέα τιμή.

string.replace(searchValue, newValue);

Το μοτίβο για την αναζήτηση της αντικατάστασης μπορεί να είναι μία μόνο συμβολοσειρά ή μια κανονική έκφραση.

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

Επιπλέον, μπορούμε να εφαρμόσουμε μια συνάρτηση στη θέση αντικατάστασης για να κάνουμε επιπλέον αλλαγές σε κάθε τιμή.

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

Η μέθοδος split() στη JavaScript αποτελεί έναν διαφορετικό τρόπο χρήσης και χειρισμού συμβολοσειρών με κανονικές εκφράσεις.

Έτσι, θα χρησιμοποιήσουμε regex για να χωρίσουμε μια δεδομένη συμβολοσειρά αναγνωρίζοντας ένα μοτίβο, π.χ. str.split(/[,.\s]/). Αυτό το μοτίβο θα χρησιμοποιηθεί ως separator.

const str = 'hello,user.how are.you';

const result = str.split(/[,.\s]/);

console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']

Οδηγίες

Έχεις προσληφθεί ως ειδικός κανονικών εκφράσεων σε μια εταιρεία που αναπτύσσει ένα Chatbot.

Βρίσκεται σε πολύ βασικό στάδιο ανάπτυξης, οπότε η αποστολή σου είναι να χρησιμοποιήσεις κανονικές εκφράσεις για να βελτιώσεις την ικανότητα του chatbot να κατανοεί και να παράγει φυσική γλώσσα.

Έλεγξε αν η εντολή είναι έγκυρη

Εκτός από έξυπνο, το Chatbot είναι και ένας πιστός βοηθός.

Για να ρωτήσει κάτι το chatbot, ο χρήστης πρέπει να πει τη λέξη "Chatbot" στην πρώτη θέση της εντολής.

Δεν έχει σημασία αν η λέξη-κλειδί είναι γραμμένη με ΚΕΦΑΛΑΙΑ ή με πεζά. Αυτό που έχει σημασία εδώ είναι η θέση της λέξης.

Υλοποίησε τη συνάρτηση isValidCommand() που βοηθά το Chatbot να αναγνωρίζει πότε ο χρήστης δίνει μια εντολή.

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

Αφαίρεσε τα κρυπτογραφημένα emoji

Το Chatbot δυσκολεύεται να καταλάβει πώς οι άνθρωποι χρησιμοποιούν τα emoji για να εκφράσουν τα συναισθήματά τους.

Όταν το chatbot λαμβάνει μηνύματα από τους χρήστες, κάθε emoji αναπαρίσταται ως "emoji" ακολουθούμενο από τον αριθμό id του.

Υλοποίησε τη μέθοδο removeEmoji() που παίρνει μια συμβολοσειρά και αφαιρεί από όλο το μήνυμα την κρυπτογράφηση των emoji.

Οι γραμμές που δεν περιέχουν κείμενο emoji πρέπει να επιστρέφονται αμετάβλητες.

Απλώς αφαίρεσε τη συμβολοσειρά του emoji. Μην επιχειρήσεις να προσαρμόσεις τα κενά.

Για αυτή τη συγκεκριμένη πρόκληση, χρησιμοποίησε τη σύνταξη κατασκευαστή για να δημιουργήσεις την κανονική έκφραση.

removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames  it's one of my hobbies"

Έλεγξε αν ο αριθμός τηλεφώνου είναι έγκυρος

Μιας και το chatbot μπορεί να κατέβει με τις λειτουργίες του σε μια εφαρμογή κινητού, ο χρήστης αναμένεται να γράψει έναν αριθμό τηλεφώνου κατά τη διάρκεια της συνομιλίας.

Το πρόβλημα είναι ότι το chatbot μπορεί να διαβάσει και να επικυρώσει μόνο έναν αριθμό με συγκεκριμένη μορφή.

Αν ο αριθμός είναι έγκυρος (ταιριάζει με την ακολουθία χαρακτήρων που ορίζει η κανονική έκφραση), το chatbot απαντά με ένα μήνυμα που ευχαριστεί τον χρήστη και επιβεβαιώνει τον αριθμό. Αν ο αριθμός δεν είναι έγκυρος, η συνάρτηση ενημερώνει τον χρήστη ότι ο αριθμός τηλεφώνου δεν είναι έγκυρος.

Η αναμενόμενη μορφή είναι: (+##) ###-###-###

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"

Βρες τον σύνδεσμο της ιστοσελίδας

Το Chatbot είναι ένα πολύ περίεργο λογισμικό. Αν και μπορεί να ψάξει στο διαδίκτυο για ένα συγκεκριμένο θέμα, του αρέσει να ρωτάει τους χρήστες για ωραίες ιστοσελίδες ή URL, ώστε να βρει σχετικές πληροφορίες.

Παράδειγμα συνομιλίας:

  • Chatbot: Γεια σου, χρήστη, θα ήθελα να μάθω να γράφω κώδικα σε JavaScript, ξέρεις καμιά ωραία ιστοσελίδα όπου θα μπορούσα να μάθω;
  • User: Έμαθα πολλά από το exercism.org

Υλοποίησε τη συνάρτηση getURL() που μπορεί να επιστρέψει έναν πίνακα με μόνο τον σύνδεσμο κάθε ιστοσελίδας. Το να γράψεις ένα regex που να αναγνωρίζει οποιοδήποτε URL θα ήταν πολύ περίπλοκο, αλλά το Chatbot χρειάζεται να διαβάζει μόνο απλά URL. Για αυτή την άσκηση, URL είναι οποιαδήποτε ακολουθία λέξεων χωρισμένη με ".".

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

Χαιρέτησε τον χρήστη

Για να αποθηκεύει δεδομένα από όλα τα άτομα με τα οποία έχει συνομιλήσει, το chatbot μπορεί να πάρει το ονοματεπώνυμο από το προφίλ του χρήστη με αυτή τη μορφή: "smith, john".

Έτσι, θέλουμε το chatbot μας να είναι πραγματικά ευγενικό και να κάνει καλή εντύπωση.

Γράψε τη συνάρτηση niceToMeetYou() που παίρνει μια συμβολοσειρά με το ονοματεπώνυμο του χρήστη και επιστρέφει τη συμβολοσειρά "Nice to meet you, John Smith"

Για εκπαιδευτικούς σκοπούς, υλοποίησε τη συνάρτηση χρησιμοποιώντας μια μέθοδο αντικατάστασης από τις κανονικές εκφράσεις.

let str = 'Smith, John';

niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
JavaScript Exercism

Έτοιμος να ξεκινήσεις την άσκηση Κανονικός Chatbot;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.