Μια κανονική έκφραση (ή regex) είναι μια ακολουθία χαρακτήρων που μπορούμε να χρησιμοποιήσουμε για να στοχεύσουμε και να χειριστούμε συγκεκριμένα στοιχεία μέσα σε συμβολοσειρές. Έτσι, μπορούμε:
💡 Η γεύση regex της JavaScript είναι μέρος του προτύπου ECMA-262 για τη γλώσσα. Αυτό σημαίνει ότι δεν χρειάζεται να ανησυχείς για συμβατότητα με συγκεκριμένους browser.
Στη JavaScript, μια κανονική έκφραση γράφεται συνήθως στη μορφή /pattern/modifiers.
Υπάρχουν δύο τρόποι για να δημιουργήσεις μια κανονική έκφραση:
const regex = /[a-z]/;
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() εκτελεί αναζήτηση για αντιστοίχιση μεταξύ μιας κανονικής έκφρασης και μιας συγκεκριμένης συμβολοσειράς. Επιστρέφει αληθής ή ψευδής.
const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);
console.log(result);
// => true
Με τη μέθοδο 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() στη 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() στη 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
Το 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, ώστε να βρει σχετικές πληροφορίες.
Παράδειγμα συνομιλίας:
Υλοποίησε τη συνάρτηση 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"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.