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

Αυτο 13.08.2019

Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Chercherείναι ένα αντικείμενο που περιγράφει ένα μοτίβο χαρακτήρων. Η κλάση RegExp στο JavaScript αντιπροσωπεύει κανονικές εκφράσεις και τα αντικείμενα κλάσης String και RegExp ορίζουν μεθόδους που χρησιμοποιούν κανονικές εκφράσεις για την εκτέλεση εργασιών αντιστοίχισης προτύπων και αναζήτησης κειμένου και αντικατάστασης. Η γραμματική τυπικής έκφρασης JavaScript περιέχει ένα αρκετά πλήρες υποσύνολο της σύνταξης κανονικών εκφράσεων που χρησιμοποιείται στο Perl 5, οπότε αν έχετε εμπειρία με την Perl, μπορείτε εύκολα να γράψετε μοτίβα σε προγράμματα JavaScript.

Τα χαρακτηριστικά των τυπικών εκφράσεων Perl που δεν υποστηρίζονται στο ECMAScript περιλαμβάνουν τις σημαίες s (λειτουργία μονής γραμμής) και x (εκτεταμένη σύνταξη). ακολουθίες διαφυγής \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z και \G και άλλες εκτεταμένες κατασκευές που ξεκινούν με (?.

Ορισμός κανονικών εκφράσεων

Στο JavaScript, οι κανονικές εκφράσεις αντιπροσωπεύονται από αντικείμενα RegExp. Τα αντικείμενα RegExp μπορούν να δημιουργηθούν χρησιμοποιώντας τον κατασκευαστή RegExp(), αλλά πιο συχνά δημιουργούνται χρησιμοποιώντας μια ειδική κυριολεκτική σύνταξη. Ακριβώς όπως τα κυριολεκτικά συμβολοσειράς καθορίζονται ως χαρακτήρες που περιβάλλονται από εισαγωγικά, τα κυριολεκτικά κανονικής έκφρασης καθορίζονται ως χαρακτήρες που περιβάλλονται από ένα ζεύγος χαρακτήρων κάθετου (/). Έτσι, ο κώδικας JavaScript μπορεί να περιέχει γραμμές όπως αυτή:

Var μοτίβο = /s$/;

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

Var pattern = new RegExp("s$");

Μια προδιαγραφή προτύπου κανονικής έκφρασης αποτελείται από μια ακολουθία χαρακτήρων. Οι περισσότεροι χαρακτήρες, συμπεριλαμβανομένων όλων των αλφαριθμητικών χαρακτήρων, περιγράφουν κυριολεκτικά τους χαρακτήρες που πρέπει να υπάρχουν. Δηλαδή, η τυπική έκφραση /java/ ταιριάζει με όλες τις γραμμές που περιέχουν την υποσυμβολοσειρά "java".

Άλλοι χαρακτήρες σε κανονικές εκφράσεις δεν προορίζονται να χρησιμοποιηθούν για την εύρεση των ακριβών ισοδύναμων τους, αλλά μάλλον έχουν ειδικές σημασίες. Για παράδειγμα, η τυπική έκφραση /s$/ περιέχει δύο χαρακτήρες. Ο πρώτος χαρακτήρας s υποδηλώνει μια αναζήτηση για έναν κυριολεκτικό χαρακτήρα. Δεύτερον, το $ είναι ένας ειδικός μεταχαρακτήρας που σηματοδοτεί το τέλος μιας γραμμής. Έτσι, αυτή η κανονική έκφραση ταιριάζει με οποιαδήποτε συμβολοσειρά που τελειώνει με τον χαρακτήρα s.

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

Κυριολεκτικοί χαρακτήρες

Όπως αναφέρθηκε προηγουμένως, όλοι οι αλφαβητικοί χαρακτήρες και οι αριθμοί σε κανονικές εκφράσεις ταιριάζουν με τον εαυτό τους. Η σύνταξη τυπικών εκφράσεων στο JavaScript υποστηρίζει επίσης τη δυνατότητα καθορισμού ορισμένων μη αλφαβητικών χαρακτήρων χρησιμοποιώντας ακολουθίες διαφυγής που ξεκινούν με έναν χαρακτήρα ανάστροφης κάθετο (\). Για παράδειγμα, η ακολουθία \n ταιριάζει με τον χαρακτήρα νέας γραμμής. Αυτά τα σύμβολα παρατίθενται στον παρακάτω πίνακα:

Ορισμένα σημεία στίξης έχουν ειδική σημασία σε κανονικές εκφράσεις:

^ $ . * + ? = ! : | \ / () { } -

Η σημασία αυτών των συμβόλων επεξηγείται στις επόμενες ενότητες. Ορισμένα από αυτά έχουν ιδιαίτερη σημασία μόνο σε ορισμένα πλαίσια κανονικής έκφρασης, ενώ σε άλλα ερμηνεύονται κυριολεκτικά. Ωστόσο, γενικά, για να συμπεριλάβετε κυριολεκτικά οποιονδήποτε από αυτούς τους χαρακτήρες σε μια κανονική έκφραση, πρέπει να προηγηθεί ένας χαρακτήρας ανάστροφης κάθετου. Άλλοι χαρακτήρες, όπως εισαγωγικά και @, δεν έχουν ιδιαίτερη σημασία και απλώς ταιριάζουν με τους εαυτούς τους σε κανονικές εκφράσεις.

Εάν δεν μπορείτε να θυμηθείτε ακριβώς από ποιους χαρακτήρες πρέπει να προηγείται το \, μπορείτε να βάλετε με ασφάλεια μια ανάστροφη κάθετο μπροστά από οποιονδήποτε από τους χαρακτήρες. Ωστόσο, έχετε κατά νου ότι πολλά γράμματα και αριθμοί παίρνουν ειδική σημασία όταν συνδυάζονται με τον κάθετο χαρακτήρα, επομένως τα γράμματα και οι αριθμοί που κυριολεκτικά αναζητάτε δεν πρέπει να προηγούνται από χαρακτήρα \. Για να συμπεριλάβετε τον ίδιο τον χαρακτήρα ανάστροφης κάθετο σε μια κανονική έκφραση, θα πρέπει προφανώς να προηγηθεί ένας άλλος χαρακτήρας ανάστροφης κάθετου. Για παράδειγμα, η ακόλουθη τυπική έκφραση ταιριάζει με οποιαδήποτε συμβολοσειρά που περιέχει έναν χαρακτήρα ανάστροφης κάθετο: /\\/.

Κατηγορίες χαρακτήρων

Οι μεμονωμένοι κυριολεκτικοί χαρακτήρες μπορούν να συνδυαστούν σε κατηγορίες χαρακτήρων περικλείοντάς τους σε αγκύλες. Μια κλάση χαρακτήρων αντιστοιχεί σε οποιονδήποτε χαρακτήρα περιέχεται σε αυτήν την κλάση. Επομένως, η τυπική έκφραση // ταιριάζει με έναν από τους χαρακτήρες a, b ή c.

Οι κατηγορίες αρνητικών χαρακτήρων μπορούν επίσης να οριστούν για να ταιριάζουν με οποιονδήποτε χαρακτήρα εκτός από αυτούς που καθορίζονται σε παρενθέσεις. Η κλάση χαρακτήρων άρνησης καθορίζεται από τον χαρακτήρα ^ ως ο πρώτος χαρακτήρας μετά την αριστερή παρένθεση. Η τυπική έκφραση /[^abc]/ ταιριάζει με οποιονδήποτε άλλο χαρακτήρα εκτός από a, b ή c. Στις κατηγορίες χαρακτήρων, μια σειρά χαρακτήρων μπορεί να καθοριστεί χρησιμοποιώντας μια παύλα. Όλοι οι πεζοί λατινικοί χαρακτήρες βρίσκονται χρησιμοποιώντας την έκφραση // και οποιοδήποτε γράμμα ή αριθμός από το σύνολο λατινικών χαρακτήρων μπορεί να βρεθεί χρησιμοποιώντας την έκφραση //.

Ορισμένες κατηγορίες χαρακτήρων είναι ιδιαίτερα κοινές, επομένως η σύνταξη τυπικών εκφράσεων στο JavaScript περιλαμβάνει ειδικούς χαρακτήρες και ακολουθίες διαφυγής για την αναπαράστασή τους. Έτσι, το \s ταιριάζει με το διάστημα, την καρτέλα και τυχόν χαρακτήρες κενού διαστήματος Unicode και το \S με οποιουσδήποτε χαρακτήρες κενού διαστήματος που δεν είναι Unicode.

Ο παρακάτω πίνακας παρέχει μια λίστα με αυτούς τους ειδικούς χαρακτήρες και τη σύνταξη των κατηγοριών χαρακτήρων. (Λάβετε υπόψη ότι ορισμένες από τις ακολουθίες διαφυγής κατηγορίας χαρακτήρων ταιριάζουν μόνο με χαρακτήρες ASCII και δεν επεκτείνονται για να λειτουργήσουν με χαρακτήρες Unicode. Μπορείτε να ορίσετε ρητά τις δικές σας κατηγορίες χαρακτήρων Unicode, για παράδειγμα /[\u0400-\u04FF]/ αντιστοιχεί σε οποιονδήποτε χαρακτήρα κυριλλικό αλφάβητο .)

Τάξεις χαρακτήρων κανονικής έκφρασης JavaScript
Σύμβολο Αλληλογραφία
[...] Οποιοσδήποτε από τους χαρακτήρες που εμφανίζονται σε παρένθεση
[^...] Οποιοσδήποτε από τους χαρακτήρες δεν αναφέρεται σε παρένθεση
. Οποιοσδήποτε χαρακτήρας εκτός από μια νέα γραμμή ή άλλο οριοθέτη γραμμής Unicode
\w Οποιοσδήποτε χαρακτήρας κειμένου ASCII. Ισοδύναμος
Κάθε χαρακτήρας που δεν είναι χαρακτήρας κειμένου ASCII. Ισοδυναμεί με [^a-zA-Z0-9_]
\μικρό Οποιοσδήποτε χαρακτήρας κενού διαστήματος από το σύνολο Unicode
\ΜΙΚΡΟ Οποιοσδήποτε χαρακτήρας χωρίς κενά από το σύνολο Unicode. Σημειώστε ότι οι χαρακτήρες \w και \S δεν είναι το ίδιο πράγμα
\ρε Τυχόν αριθμοί ASCII. Ισοδύναμος
\ΡΕ Οποιοσδήποτε χαρακτήρας εκτός από αριθμούς ASCII. Ισοδυναμεί με [^0-9]
[\σι] Backspace χαρακτήρας κυριολεκτικά

Σημειώστε ότι οι ακολουθίες διαφυγής ειδικών χαρακτήρων κατηγορίας μπορούν να περικλείονται σε αγκύλες. Το \s ταιριάζει με οποιονδήποτε χαρακτήρα κενού διαστήματος και το \d ταιριάζει με οποιοδήποτε ψηφίο, επομένως το /[\s\d]/ ταιριάζει με οποιονδήποτε χαρακτήρα ή ψηφίο κενού διαστήματος.

Επανάληψη

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

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

Οι ακόλουθες γραμμές δείχνουν πολλά παραδείγματα:

Var pattern = /\d(2,4)/; // Ταιριάζει με έναν αριθμό που περιέχει δύο έως τέσσερα ψηφία = /\w(3)\d?/; // Αντιστοιχίστε ακριβώς τρεις χαρακτήρες λέξης και ένα προαιρετικό μοτίβο ψηφίων = /\s+java\s+/; // Αντιστοιχίζει τη λέξη "java" με ένα ή περισσότερα κενά // πριν και μετά το μοτίβο = /[^(]*/; // Ταιριάζει με μηδέν ή περισσότερους χαρακτήρες εκτός από την αρχική παρένθεση

Να είστε προσεκτικοί όταν χρησιμοποιείτε επαναλαμβανόμενους χαρακτήρες * και ?. Μπορούν να ταιριάζουν με την απουσία ενός μοτίβου που έχει καθοριστεί πριν από αυτά και επομένως την απουσία χαρακτήρων. Για παράδειγμα, η τυπική έκφραση /a*/ ταιριάζει με τη συμβολοσειρά "bbbb" επειδή δεν περιέχει τον χαρακτήρα a.

Οι χαρακτήρες επανάληψης που αναφέρονται στον πίνακα αντιπροσωπεύουν τον μέγιστο δυνατό αριθμό επαναλήψεων που θα επιτρέψουν την αντιστοίχιση των επόμενων τμημάτων της κανονικής έκφρασης. Λέμε ότι αυτό είναι άπληστη επανάληψη. Είναι επίσης δυνατή η εφαρμογή της επανάληψης με μη άπληστο τρόπο. Αρκεί να υποδείξετε ένα ερωτηματικό μετά το σύμβολο επανάληψης (ή σύμβολα): ??, +?, *? ή ακόμα και (1,5);.

Για παράδειγμα, η τυπική έκφραση /a+/ ταιριάζει με μία ή περισσότερες περιπτώσεις του γράμματος a. Όταν εφαρμόζεται στη συμβολοσειρά "aaa", ταιριάζει και με τα τρία γράμματα. Από την άλλη πλευρά, η έκφραση /a+?/ ταιριάζει με μία ή περισσότερες περιπτώσεις του γράμματος a και επιλέγει τον μικρότερο δυνατό αριθμό χαρακτήρων. Εφαρμόζεται στην ίδια συμβολοσειρά, αυτό το μοτίβο ταιριάζει μόνο με το πρώτο γράμμα a.

Η «άπληστη» επανάληψη δεν δίνει πάντα το αναμενόμενο αποτέλεσμα. Εξετάστε το μοτίβο /a+b/, το οποίο ταιριάζει με ένα ή περισσότερα α ακολουθούμενα από b. Όταν εφαρμόζεται στη συμβολοσειρά "aaab", αντιστοιχεί σε ολόκληρη τη συμβολοσειρά.

Τώρα ας ελέγξουμε τη "μη άπληστη" έκδοση του /a+?b/. Θα μπορούσε κανείς να σκεφτεί ότι θα ταίριαζε με ένα β πριν από μόνο ένα α. Εάν εφαρμοστεί στην ίδια συμβολοσειρά, το "aaab" αναμένεται να ταιριάζει με τον μοναδικό χαρακτήρα a και τον τελευταίο χαρακτήρα b. Ωστόσο, αυτό το μοτίβο ταιριάζει πραγματικά με ολόκληρη τη συμβολοσειρά, όπως και η άπληστη έκδοση. Το γεγονός είναι ότι μια αναζήτηση προτύπων κανονικής έκφρασης εκτελείται με την εύρεση της πρώτης θέσης στη συμβολοσειρά, ξεκινώντας από την οποία καθίσταται δυνατή η αντιστοίχιση. Εφόσον είναι δυνατή η αντιστοίχιση ξεκινώντας από τον πρώτο χαρακτήρα της συμβολοσειράς, δεν λαμβάνονται καν υπόψη μικρότερες αντιστοιχίσεις που ξεκινούν από επόμενους χαρακτήρες.

Εναλλακτικές λύσεις, Ομαδοποίηση και Σύνδεσμοι

Η γραμματική τυπικής έκφρασης περιλαμβάνει ειδικούς χαρακτήρες για τον ορισμό εναλλακτικών, την ομαδοποίηση υποεκφράσεων και αναφορές σε προηγούμενες υποεκφράσεις. Σύμβολο σωλήνα | χρησιμεύει στον διαχωρισμό εναλλακτικών. Για παράδειγμα, το /ab|cd|ef/ ταιριάζει είτε με τη συμβολοσειρά "ab", ή τη συμβολοσειρά "cd", ή τη συμβολοσειρά "ef", και το μοτίβο /\d(3)|(4)/ ταιριάζει με τρία ψηφία ή τέσσερα πεζά γράμματα.

Σημειώστε ότι οι εναλλακτικές υποβάλλονται σε επεξεργασία από αριστερά προς τα δεξιά μέχρι να βρεθεί μια αντιστοιχία. Εάν βρεθεί μια αντιστοιχία με την αριστερή εναλλακτική, η δεξιά αγνοείται, ακόμα κι αν μπορεί να επιτευχθεί μια «καλύτερη» αντιστοίχιση. Επομένως, όταν το μοτίβο /a|ab/ εφαρμόζεται στη συμβολοσειρά "ab", θα ταιριάζει μόνο με τον πρώτο χαρακτήρα.

Οι παρενθέσεις έχουν πολλαπλές σημασίες σε κανονικές εκφράσεις. Ένα από αυτά είναι η ομαδοποίηση μεμονωμένων στοιχείων σε μία υποέκφραση, έτσι ώστε τα στοιχεία κατά τη χρήση των ειδικών χαρακτήρων |, *, +, ? και άλλα θεωρούνται ως ένα σύνολο. Για παράδειγμα, το μοτίβο /java(script)?/ ταιριάζει με τη λέξη "java" ακολουθούμενη από την προαιρετική λέξη "script" και το /(ab|cd)+|ef)/ ταιριάζει είτε με τη συμβολοσειρά "ef" ή μία ή περισσότερες επαναλήψεις μιας από τις χορδές "ab" ή "cd".

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

Ας υποθέσουμε ότι θέλετε να βρείτε ένα ή περισσότερα πεζά γράμματα ακολουθούμενα από έναν ή περισσότερους αριθμούς. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε το πρότυπο /+\d+/. Αλλά ας υποθέσουμε επίσης ότι θέλουμε μόνο τους αριθμούς στο τέλος κάθε αγώνα. Αν βάλουμε αυτό το μέρος του μοτίβου σε παρένθεση (/+(\d+)/), μπορούμε να εξαγάγουμε αριθμούς από όποια αντιστοιχία βρούμε. Το πώς γίνεται αυτό θα περιγραφεί παρακάτω.

Μια σχετική χρήση των παρενθετικών υποεκφράσεων είναι η αναφορά σε υποεκφράσεις από ένα προηγούμενο τμήμα της ίδιας κανονικής έκφρασης. Αυτό επιτυγχάνεται καθορίζοντας ένα ή περισσότερα ψηφία μετά τον χαρακτήρα \. Οι αριθμοί αναφέρονται στη θέση της υποέκφρασης σε παρένθεση εντός της κανονικής έκφρασης. Για παράδειγμα, το \1 αναφέρεται στην πρώτη υποέκφραση και το \3 αναφέρεται στην τρίτη. Σημειώστε ότι οι υποεκφράσεις μπορούν να είναι ένθετες η μία μέσα στην άλλη, επομένως η θέση της αριστερής παρένθεσης χρησιμοποιείται κατά την μέτρηση. Για παράδειγμα, στην ακόλουθη κανονική έκφραση, μια αναφορά ένθετης υποέκφρασης (cript) θα μοιάζει με \2:

/(ava(cript)?)\sis\s(fun\w*)/

Μια αναφορά σε μια προηγούμενη υποέκφραση δεν δείχνει το μοτίβο αυτής της υποέκφρασης, αλλά το κείμενο που βρέθηκε ότι ταιριάζει με αυτό το μοτίβο. Επομένως, οι αναφορές μπορούν να χρησιμοποιηθούν για να επιβάλουν έναν περιορισμό που επιλέγει μέρη μιας συμβολοσειράς που περιέχουν ακριβώς τους ίδιους χαρακτήρες. Για παράδειγμα, η ακόλουθη τυπική έκφραση ταιριάζει με μηδέν ή περισσότερους χαρακτήρες μέσα σε μονά ή διπλά εισαγωγικά. Ωστόσο, δεν απαιτεί τα εισαγωγικά έναρξης και κλεισίματος να ταιριάζουν μεταξύ τους (δηλαδή και τα δύο εισαγωγικά να είναι μονά ή διπλά):

/[""][^""]*[""]/

Μπορούμε να απαιτήσουμε να ταιριάζουν τα εισαγωγικά χρησιμοποιώντας μια αναφορά όπως αυτή:

Εδώ το \1 ταιριάζει με την πρώτη υποέκφραση. Σε αυτό το παράδειγμα, ο σύνδεσμος επιβάλλει έναν περιορισμό που απαιτεί το εισαγωγικό κλεισίματος να ταιριάζει με το εισαγωγικό έναρξης. Αυτή η τυπική έκφραση δεν επιτρέπει μεμονωμένα εισαγωγικά μέσα σε διπλά εισαγωγικά και το αντίστροφο.

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

/(ava(?:cript)?)\sis\s(fun\w*)/

Εδώ η υποέκφραση (?:cript) χρειάζεται μόνο για την ομαδοποίηση, ώστε ο χαρακτήρας επανάληψης να μπορεί να εφαρμοστεί στην ομάδα. Αυτές οι τροποποιημένες παρενθέσεις δεν δημιουργούν σύνδεσμο, επομένως σε αυτήν την κανονική έκφραση, το \2 αναφέρεται σε κείμενο που ταιριάζει με το μοτίβο (fun\w*).

Ο παρακάτω πίνακας παραθέτει τους τελεστές επιλογής, ομαδοποίησης και αναφοράς σε κανονικές εκφράσεις:

Σύμβολα επιλογής JavaScript, ομαδοποίηση και σύνδεση τυπικών εκφράσεων
Σύμβολο Εννοια
| Εναλλακτική λύση. Ταιριάζει είτε με την υποέκφραση στα αριστερά είτε με την υποέκφραση στα δεξιά.
(...) Ομαδοποίηση. Ομαδοποιεί στοιχεία σε μια ενιαία μονάδα που μπορεί να χρησιμοποιηθεί με τους χαρακτήρες *, +, ?, | και τα λοιπά. Επίσης θυμάται χαρακτήρες που ταιριάζουν με αυτήν την ομάδα για χρήση σε επόμενες αναφορές.
(?:...) Μόνο ομαδοποίηση. Ομαδοποιεί στοιχεία σε μία ενότητα, αλλά δεν θυμάται τους χαρακτήρες που αντιστοιχούν σε αυτήν την ομάδα.
\αριθμός Ταιριάζει με τους ίδιους χαρακτήρες που βρέθηκαν κατά την αντιστοίχιση του αριθμού ομάδας. Οι ομάδες είναι υποεκφράσεις μέσα σε (πιθανώς ένθετες) παρενθέσεις. Οι αριθμοί των ομάδων εκχωρούνται μετρώντας τις αριστερές παρενθέσεις από αριστερά προς τα δεξιά. Οι ομάδες που σχηματίζονται χρησιμοποιώντας τα σύμβολα (?:) δεν είναι αριθμημένες.

Καθορισμός θέσης αγώνα

Όπως περιγράφηκε προηγουμένως, πολλά στοιχεία μιας κανονικής έκφρασης ταιριάζουν με έναν μόνο χαρακτήρα σε μια συμβολοσειρά. Για παράδειγμα, το \s αντιστοιχεί σε έναν χαρακτήρα κενού διαστήματος. Άλλα στοιχεία κανονικής έκφρασης ταιριάζουν με τις θέσεις μεταξύ των χαρακτήρων και όχι με τους ίδιους τους χαρακτήρες. Για παράδειγμα, το \b ταιριάζει με ένα όριο λέξης—το όριο μεταξύ \w (χαρακτήρας κειμένου ASCII) και \W (χαρακτήρας χωρίς κείμενο) ή το όριο μεταξύ ενός χαρακτήρα κειμένου ASCII και της αρχής ή του τέλους μιας γραμμής.

Στοιχεία όπως το \b δεν καθορίζουν χαρακτήρες που πρέπει να υπάρχουν στην αντιστοιχισμένη συμβολοσειρά, αλλά καθορίζουν έγκυρες θέσεις για αντιστοίχιση. Αυτά τα στοιχεία ονομάζονται μερικές φορές στοιχεία αγκύρωσης κανονικής έκφρασης επειδή αγκυρώνουν το μοτίβο σε μια συγκεκριμένη θέση στη συμβολοσειρά. Τα πιο συχνά χρησιμοποιούμενα στοιχεία αγκύρωσης είναι τα ^ και $, τα οποία συνδέουν μοτίβα με την αρχή και το τέλος μιας γραμμής, αντίστοιχα.

Για παράδειγμα, η λέξη "JavaScript" στη δική της γραμμή μπορεί να βρεθεί χρησιμοποιώντας την κανονική έκφραση /^JavaScript$/. Για να βρείτε τη μεμονωμένη λέξη "Java" (και όχι ένα πρόθεμα όπως "JavaScript"), μπορείτε να δοκιμάσετε να χρησιμοποιήσετε το μοτίβο /\sJava\s/, το οποίο απαιτεί ένα διάστημα πριν και μετά τη λέξη.

Αλλά μια τέτοια λύση εγείρει δύο προβλήματα. Πρώτον, θα βρει τη λέξη "Java" μόνο εάν περιβάλλεται από κενά και στις δύο πλευρές και δεν θα μπορεί να τη βρει στην αρχή ή στο τέλος της γραμμής. Δεύτερον, όταν αυτό το μοτίβο όντως ταιριάζει, η συμβολοσειρά που επιστρέφει θα περιέχει κενά προπορευόμενα και τελικώς, κάτι που δεν είναι ακριβώς αυτό που θέλουμε. Επομένως, αντί να χρησιμοποιούμε ένα μοτίβο που ταιριάζει με χαρακτήρες κενού διαστήματος \s, θα χρησιμοποιήσουμε ένα μοτίβο (ή άγκυρα) που ταιριάζει με τα όρια λέξεων \b. Το αποτέλεσμα θα είναι η ακόλουθη έκφραση: /\bJava\b/.

Το στοιχείο αγκύρωσης \B ταιριάζει με μια θέση που δεν είναι όριο λέξης. Δηλαδή, το μοτίβο /\Bcript/ θα ταιριάζει με τις λέξεις "JavaScript" και "postscript" και δεν θα ταιριάζει με τις λέξεις "script" ή "Scripting".

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

Για παράδειγμα, για να αντιστοιχίσετε το όνομα μιας κοινής γλώσσας προγραμματισμού που ακολουθείται από άνω και κάτω τελεία, μπορείτε να χρησιμοποιήσετε την έκφραση /ava(cript)?(?=\:)/. Αυτό το μοτίβο ταιριάζει με τη λέξη "JavaScript" στη συμβολοσειρά "JavaScript: The Definitive Guide", αλλά δεν θα ταιριάζει με τη λέξη "Java" στη συμβολοσειρά "Java in a Nutshell" επειδή δεν ακολουθείται από άνω και κάτω τελεία.

Εάν εισαγάγετε τη συνθήκη (?!), τότε αυτός θα είναι ένας αρνητικός έλεγχος προς τα εμπρός για τους επόμενους χαρακτήρες, που απαιτεί οι ακόλουθοι χαρακτήρες να μην ταιριάζουν με το καθορισμένο μοτίβο, για παράδειγμα, το μοτίβο /Java(?!Script)(\w*. )/ ταιριάζει με τη συμβολοσειρά "Java", ακολουθούμενη από ένα κεφαλαίο γράμμα και οποιονδήποτε αριθμό χαρακτήρων κειμένου ASCII, με την προϋπόθεση ότι η υποσυμβολοσειρά "Java" δεν ακολουθείται από τη συμβολοσειρά "Script", αλλά θα ταιριάζει με τη συμβολοσειρά "JavaBeans". δεν ταιριάζει με τη συμβολοσειρά "Javanese", θα ταιριάζει με τη συμβολοσειρά "JavaScrip", αλλά δεν θα ταιριάζει με τις συμβολοσειρές "JavaScript" ή "JavaScripter".

Ο παρακάτω πίνακας παρέχει μια λίστα χαρακτήρων αγκύρωσης κανονικών εκφράσεων:

Χαρακτήρες αγκύρωσης κανονικής έκφρασης
Σύμβολο Εννοια
^ Ταιριάζει με την αρχή μιας έκφρασης συμβολοσειράς ή την αρχή μιας γραμμής σε μια αναζήτηση πολλών γραμμών.
$ Ταιριάζει με το τέλος μιας έκφρασης συμβολοσειράς ή το τέλος μιας γραμμής σε μια αναζήτηση πολλών γραμμών.
\σι Ταιριάζει σε ένα όριο λέξης, π.χ. ταιριάζει με τη θέση μεταξύ του χαρακτήρα \w και του χαρακτήρα \W ή μεταξύ του χαρακτήρα \w και της αρχής ή του τέλους μιας γραμμής. (Σημειώστε, ωστόσο, ότι το [\b] ταιριάζει με τον χαρακτήρα backspace.)
\ΣΙ Ταιριάζει με μια θέση που δεν είναι όριο λέξης.
(?=p) Θετικός έλεγχος προοπτικής για επόμενους χαρακτήρες. Απαιτεί τους επόμενους χαρακτήρες για να ταιριάζουν με το μοτίβο p, αλλά δεν περιλαμβάνει αυτούς τους χαρακτήρες στην αντιστοιχισμένη συμβολοσειρά.
(?!p) Αρνητικός έλεγχος προς τα εμπρός για επόμενους χαρακτήρες. Απαιτεί οι παρακάτω χαρακτήρες να μην ταιριάζουν με το μοτίβο p.

Σημαίες

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

Σημαία iκαθορίζει ότι η αντιστοίχιση μοτίβων δεν πρέπει να γίνεται διάκριση πεζών-κεφαλαίων και σημαία ζ- ότι η αναζήτηση πρέπει να είναι σφαιρική, δηλ. πρέπει να βρεθούν όλες οι αντιστοιχίες στη συμβολοσειρά. Σημαία mεκτελεί αναζήτηση μοτίβου σε λειτουργία πολλαπλών γραμμών. Εάν η έκφραση συμβολοσειράς που αναζητείται περιέχει νέες γραμμές, τότε σε αυτήν τη λειτουργία οι χαρακτήρες αγκύρωσης ^ και $, εκτός από το ότι ταιριάζουν με την αρχή και το τέλος ολόκληρης της έκφρασης συμβολοσειράς, ταιριάζουν επίσης με την αρχή και το τέλος κάθε γραμμής κειμένου. Για παράδειγμα, το μοτίβο /java$/im ταιριάζει τόσο με το "java" και το "Java\nis fun".

Αυτές οι σημαίες μπορούν να συνδυαστούν σε οποιονδήποτε συνδυασμό. Για παράδειγμα, για να αναζητήσετε την πρώτη εμφάνιση της λέξης "java" (ή "Java", "JAVA" κ.λπ.) με τρόπο χωρίς διάκριση πεζών-κεφαλαίων, μπορείτε να χρησιμοποιήσετε την κανονική έκφραση χωρίς διάκριση πεζών-κεφαλαίων /\bjava\b/ εγώ. Και για να βρείτε όλες τις εμφανίσεις αυτής της λέξης σε μια συμβολοσειρά, μπορείτε να προσθέσετε τη σημαία g: /\bjava\b/gi.

Μέθοδοι της κλάσης String για αναζήτηση κατά μοτίβο

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

Οι συμβολοσειρές υποστηρίζουν τέσσερις μεθόδους που χρησιμοποιούν κανονικές εκφράσεις. Η απλούστερη από αυτές είναι η μέθοδος έρευνα(). Λαμβάνει μια τυπική έκφραση ως όρισμα και επιστρέφει είτε τη θέση του πρώτου χαρακτήρα της αντιστοιχισμένης υποσυμβολοσειράς είτε -1 εάν δεν βρεθεί αντιστοίχιση. Για παράδειγμα, η ακόλουθη κλήση θα επιστρέψει 4:

Var result = "JavaScript".search(/script/i); // 4

Εάν το όρισμα στη μέθοδο search() δεν είναι κανονική έκφραση, μετατρέπεται πρώτα μεταβιβάζοντάς το στον κατασκευαστή RegExp. Η μέθοδος search() δεν υποστηρίζει καθολική αναζήτηση και αγνοεί τη σημαία g στο όρισμά της.

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

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

Για παράδειγμα, μπορούμε να χρησιμοποιήσουμε τη μέθοδο replace() για να γράψουμε με κεφαλαία τη λέξη "JavaScript" με συνέπεια σε μια ολόκληρη γραμμή κειμένου:

// Ανεξάρτητα από την περίπτωση των χαρακτήρων, τους αντικαθιστούμε με μια λέξη στην απαιτούμενη περίπτωση var result = "javascript".replace(/JavaScript/ig, "JavaScript");

Η μέθοδος replace() είναι πιο ισχυρή από ό,τι θα προτείνει αυτό το παράδειγμα. Επιτρέψτε μου να σας υπενθυμίσω ότι οι υποεκφράσεις σε παρένθεση μέσα σε μια κανονική έκφραση αριθμούνται από αριστερά προς τα δεξιά και ότι η κανονική έκφραση θυμάται το κείμενο που αντιστοιχεί σε καθεμία από τις υποεκφράσεις. Εάν η συμβολοσειρά αντικατάστασης περιέχει ένα σύμβολο $ ακολουθούμενο από έναν αριθμό, η μέθοδος replace() αντικαθιστά αυτούς τους δύο χαρακτήρες με το κείμενο που ταιριάζει με την καθορισμένη υποέκφραση. Αυτό είναι ένα πολύ χρήσιμο χαρακτηριστικό. Μπορούμε να το χρησιμοποιήσουμε, για παράδειγμα, για να αντικαταστήσουμε τα ίσια εισαγωγικά σε μια συμβολοσειρά με τυπογραφικά εισαγωγικά, τα οποία προσομοιώνονται με χαρακτήρες ASCII:

// Ένα απόσπασμα είναι ένα εισαγωγικό ακολουθούμενο από οποιονδήποτε αριθμό χαρακτήρων // εκτός από εισαγωγικά (που θυμόμαστε), ακολουθούμενο από ένα άλλο εισαγωγικό // var quote = /"([^"]*)"/g; // Αντικαταστήστε το ίσια εισαγωγικά με τυπογραφικά και αφήστε το "$1" αμετάβλητο // τα περιεχόμενα της προσφοράς είναι αποθηκευμένα σε $1 var text = ""JavaScript" είναι μια ερμηνευμένη γλώσσα προγραμματισμού." ) ; // Το "JavaScript" είναι μια ερμηνευμένη γλώσσα προγραμματισμού.

Ένα σημαντικό πράγμα που πρέπει να σημειωθεί είναι ότι το δεύτερο όρισμα για την αντικατάσταση() μπορεί να είναι μια συνάρτηση που υπολογίζει δυναμικά τη συμβολοσειρά αντικατάστασης.

Μέθοδος αγώνας()είναι η πιο γενική από τις μεθόδους κλάσης String που χρησιμοποιούν κανονικές εκφράσεις. Λαμβάνει μια κανονική έκφραση ως μοναδικό όρισμα (ή μετατρέπει το όρισμά της σε κανονική έκφραση περνώντας την στον κατασκευαστή RegExp()) και επιστρέφει έναν πίνακα που περιέχει τα αποτελέσματα αναζήτησης. Εάν η σημαία g έχει οριστεί στην κανονική έκφραση, η μέθοδος επιστρέφει έναν πίνακα όλων των αντιστοιχιών που υπάρχουν στη συμβολοσειρά. Για παράδειγμα:

// θα επιστρέψει ["1", "2", "3"] var result = "1 συν 2 ισούται με 3".match(/\d+/g);

Εάν η τυπική έκφραση δεν περιέχει τη σημαία g, η μέθοδος match() δεν εκτελεί καθολική αναζήτηση. απλά φαίνεται για το πρώτο ματς. Ωστόσο, η match() επιστρέφει έναν πίνακα ακόμα και όταν η μέθοδος δεν εκτελεί καθολική αναζήτηση. Σε αυτήν την περίπτωση, το πρώτο στοιχείο του πίνακα είναι η υποσυμβολοσειρά που βρέθηκε και όλα τα υπόλοιπα στοιχεία είναι υποεκφράσεις της κανονικής έκφρασης. Επομένως, εάν η match() επιστρέφει έναν πίνακα arr, τότε το arr θα περιέχει ολόκληρη τη συμβολοσειρά που βρέθηκε, arr την υποσυμβολοσειρά που αντιστοιχεί στην πρώτη υποέκφραση, κ.λπ. Σχεδιάζοντας μια παράλληλη με τη μέθοδο replace(), μπορούμε να πούμε ότι τα περιεχόμενα του $n εισάγονται στο arr[n].

Για παράδειγμα, ρίξτε μια ματιά στον ακόλουθο κώδικα που αναλύει μια διεύθυνση URL:

Var url = /(\w+):\/\/([\w.]+)\/(\S*)/; var text = "Επισκεφτείτε τον ιστότοπό μας http://www..php"; var result = text.match(url); if (αποτέλεσμα != null) ( var fullurl = αποτέλεσμα; // Περιέχει "http://www..php" var πρωτόκολλο = αποτέλεσμα; // Περιέχει "http" var host = αποτέλεσμα; // Περιέχει "www..php " )

Θα πρέπει να σημειωθεί ότι για μια κανονική έκφραση που δεν έχει το σύνολο g σημαία καθολικής αναζήτησης, η μέθοδος match() επιστρέφει την ίδια τιμή με τη μέθοδο exec() της κανονικής έκφρασης: ο πίνακας που επιστρέφεται έχει τις ιδιότητες ευρετηρίου και εισόδου, όπως περιγράφεται στη συζήτηση του exec( ) παρακάτω.

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

"123,456,789".split(","); // Επιστροφή ["123", "456", "789"]

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

"1, 2, 3 , 4 , 5".split(/\s*,\s*/); // Επιστροφή ["1", "2", "3", "4", "5"]

Αντικείμενο RegExp

Όπως αναφέρθηκε, οι κανονικές εκφράσεις αντιπροσωπεύονται ως αντικείμενα RegExp. Εκτός από τον κατασκευαστή RegExp(), τα αντικείμενα RegExp υποστηρίζουν τρεις μεθόδους και πολλές ιδιότητες.

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

Το δεύτερο όρισμα της RegExp() ενδέχεται να λείπει. Εάν ορίζεται, ορίζει τις σημαίες κανονικής έκφρασης. Πρέπει να είναι ένας από τους χαρακτήρες g, i, m ή συνδυασμός αυτών των χαρακτήρων. Για παράδειγμα:

// Βρίσκει όλους τους πενταψήφιους αριθμούς σε μια συμβολοσειρά. Σημείωση // η χρήση συμβόλων σε αυτό το παράδειγμα \\ var zipcode = new RegExp("\\d(5)", "g");

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

Ιδιότητες RegExp

Κάθε αντικείμενο RegExp έχει πέντε ιδιότητες. Ιδιοκτησία πηγή- μια συμβολοσειρά μόνο για ανάγνωση που περιέχει το κείμενο της κανονικής έκφρασης. Ιδιοκτησία καθολικόςείναι μια δυαδική τιμή μόνο για ανάγνωση που καθορίζει εάν η σημαία g υπάρχει στην κανονική έκφραση. Ιδιοκτησία ignoreCaseείναι μια τιμή boolean μόνο για ανάγνωση που καθορίζει εάν η σημαία i υπάρχει στην κανονική έκφραση. Ιδιοκτησία πολλαπλών γραμμώνείναι μια τιμή boolean μόνο για ανάγνωση που καθορίζει εάν η σημαία m υπάρχει στην κανονική έκφραση. Και το τελευταίο ακίνητο lastIndexείναι ένας ακέραιος που μπορεί να διαβαστεί και να γραφτεί. Για μοτίβα με τη σημαία g, αυτή η ιδιότητα περιέχει τον αριθμό θέσης στη γραμμή από την οποία πρέπει να ξεκινήσει η επόμενη αναζήτηση. Όπως περιγράφεται παρακάτω, χρησιμοποιείται από τις μεθόδους exec() και test().

Μέθοδοι RegExp

Τα αντικείμενα RegExp ορίζουν δύο μεθόδους που εκτελούν αντιστοίχιση προτύπων. συμπεριφέρονται παρόμοια με τις μεθόδους κλάσης String που περιγράφονται παραπάνω. Η κύρια μέθοδος της κλάσης RegExp που χρησιμοποιείται για την αντιστοίχιση προτύπων είναι exec(). Είναι παρόμοια με τη μέθοδο String class match() που αναφέρθηκε παραπάνω, με τη διαφορά ότι είναι μια μέθοδος κλάσης RegExp που παίρνει μια συμβολοσειρά ως όρισμα, αντί για μια μέθοδο κλάσης String που παίρνει ένα όρισμα RegExp.

Η μέθοδος exec() εκτελεί την κανονική έκφραση για την καθορισμένη συμβολοσειρά, δηλ. ψάχνει για ταίρι σε μια χορδή. Εάν δεν βρεθεί αντιστοίχιση, η μέθοδος επιστρέφει μηδενική. Ωστόσο, εάν βρεθεί μια αντιστοίχιση, επιστρέφει τον ίδιο πίνακα με τον πίνακα που επιστρέφεται από τη μέθοδο match() για αναζήτηση χωρίς τη σημαία g. Το μηδενικό στοιχείο του πίνακα περιέχει τη συμβολοσειρά που ταιριάζει με την κανονική έκφραση και όλα τα επόμενα στοιχεία περιέχουν υποσυμβολοσειρές που ταιριάζουν με όλες τις υποεκφράσεις. Επιπλέον, το ακίνητο δείκτηςπεριέχει τον αριθμό θέσης του χαρακτήρα με τον οποίο ξεκινά το αντίστοιχο τμήμα και την ιδιότητα εισαγωγήαναφέρεται στη γραμμή που έγινε αναζήτηση.

Σε αντίθεση με το match(), η μέθοδος exec() επιστρέφει έναν πίνακα του οποίου η δομή δεν εξαρτάται από την παρουσία της σημαίας g στην κανονική έκφραση. Επιτρέψτε μου να σας υπενθυμίσω ότι όταν μεταβιβάζετε μια καθολική τυπική έκφραση, η μέθοδος match() επιστρέφει έναν πίνακα αντιστοιχιών που βρέθηκαν. Και το exec() επιστρέφει πάντα ένα ταίριασμα, αλλά παρέχει πλήρεις πληροφορίες σχετικά με αυτό. Όταν η exec() καλείται σε μια κανονική παράσταση που περιέχει τη σημαία g, η μέθοδος ορίζει την ιδιότητα lastIndex του αντικειμένου κανονικής έκφρασης στον αριθμό θέσης του χαρακτήρα αμέσως μετά την υποσυμβολοσειρά που βρέθηκε.

Όταν η exec() καλείται δεύτερη φορά στην ίδια κανονική έκφραση, ξεκινά την αναζήτηση στον χαρακτήρα του οποίου η θέση καθορίζεται στην ιδιότητα lastIndex. Εάν η exec() δεν βρει αντιστοίχιση, η ιδιότητα lastIndex ορίζεται σε 0. (Μπορείτε επίσης να ορίσετε το lastIndex σε μηδέν ανά πάσα στιγμή, κάτι που θα πρέπει να γίνεται σε όλες τις περιπτώσεις όπου η αναζήτηση τελειώνει πριν από την τελευταία αντιστοίχιση σε μία σειρά βρέθηκε και η αναζήτηση ξεκινά σε άλλη γραμμή με το ίδιο αντικείμενο RegExp.) Αυτή η ειδική συμπεριφορά επιτρέπει την επανειλημμένη κλήση της exec() για επανάληψη σε όλες τις αντιστοιχίσεις της κανονικής έκφρασης στη γραμμή. Για παράδειγμα:

Var pattern = /Java/g; var text = "Η JavaScript είναι πιο διασκεδαστική από την Java!"; var αποτέλεσμα? while((result = pattern.exec(text)) != null) ( console.log("Βρέθηκε "" + αποτέλεσμα + """ + "στη θέση " + result.index + "; η επόμενη αναζήτηση θα ξεκινήσει στο " + μοτίβο .lastIndex);

Μια άλλη μέθοδος του αντικειμένου RegExp είναι δοκιμή(), η οποία είναι πολύ πιο απλή από τη μέθοδο exec(). Παίρνει μια συμβολοσειρά και επιστρέφει true αν η συμβολοσειρά ταιριάζει με την κανονική έκφραση:

Var pattern = /java/i; pattern.test("JavaScript"); // Επιστροφή true

Η κλήση της test() είναι ισοδύναμη με την κλήση της exec(), η οποία επιστρέφει true αν η exec() επιστρέφει κάτι διαφορετικό από null. Για το λόγο αυτό, η μέθοδος test() συμπεριφέρεται με τον ίδιο τρόπο όπως η μέθοδος exec() όταν καλείται σε μια καθολική κανονική έκφραση: ξεκινά την αναζήτηση για την καθορισμένη συμβολοσειρά στη θέση που καθορίζεται από την ιδιότητα lastIndex και αν βρει ταύτιση , ορίζει την ιδιότητα lastIndex στον αριθμό θέσης χαρακτήρα ακριβώς δίπλα στην αντιστοιχία που βρέθηκε. Επομένως, χρησιμοποιώντας τη μέθοδο test(), μπορείτε να δημιουργήσετε έναν βρόχο διέλευσης γραμμής με τον ίδιο τρόπο όπως χρησιμοποιώντας τη μέθοδο exec().

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

/pattern/flags new RegExp("pattern"[, επιλογές αναζήτησης])

πρότυπο- μια κανονική έκφραση για αναζήτηση (περισσότερα για την αντικατάσταση αργότερα) και σημαίες - μια συμβολοσειρά οποιουδήποτε συνδυασμού χαρακτήρων g (καθολική αναζήτηση), i (η κεφαλαία δεν είναι σημαντική) και m (αναζήτηση πολλών γραμμών). Η πρώτη μέθοδος χρησιμοποιείται συχνά, η δεύτερη - μερικές φορές. Για παράδειγμα, δύο τέτοιες κλήσεις είναι ισοδύναμες.

Επιλογές αναζήτησης

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

Χαρακτήρες σε κανονικές εκφράσεις JavaScript

ΣύμβολοΑλληλογραφία
Αλφαριθμητικοί χαρακτήρεςΑντιστοιχούν στον εαυτό τους
\0 NUL χαρακτήρας (\u0000)
\ tΚαρτέλα (\u0009)
\nΡοή γραμμής (\u000A)
\vΚάθετη καρτέλα (\u000B)
\φάΜετάφραση σελίδας (\u000C)
\rΕπιστροφή μεταφοράς (\u000D)
\xnnΈνας χαρακτήρας από το λατινικό σύνολο, που καθορίζεται από τον δεκαεξαδικό αριθμό nn. για παράδειγμα, το \x0A είναι το ίδιο με το \n
\uxxxxΧαρακτήρας Unicode που καθορίζεται από δεκαεξαδικό αριθμό xxxx. για παράδειγμα, \u0009 είναι το ίδιο με το \t
\cXΟ χαρακτήρας ελέγχου "X", για παράδειγμα, η ακολουθία \cJ είναι ισοδύναμη με τον χαρακτήρα νέας γραμμής \n
\ Για κανονικούς χαρακτήρες - τους κάνει ξεχωριστούς. Για παράδειγμα, η έκφραση /s/ απλώς αναζητά τον χαρακτήρα "s". Και αν βάλετε \ πριν από το s, τότε το /\s/ υποδηλώνει ήδη έναν χαρακτήρα διαστήματος Και αντίστροφα, εάν ο χαρακτήρας είναι ειδικός, για παράδειγμα *, τότε το \ θα τον κάνει απλώς έναν κανονικό χαρακτήρα "αστερίσκο". Για παράδειγμα, το /a*/ αναζητά 0 ή περισσότερους διαδοχικούς χαρακτήρες "a". Για να βρείτε ένα με αστερίσκο "a*" - βάλτε \ μπροστά από το ειδικό. σύμβολο: /a\*/ .
^ Υποδεικνύει την αρχή των δεδομένων εισόδου. Εάν έχει οριστεί η σημαία αναζήτησης πολλαπλών γραμμών ("m"), θα ενεργοποιηθεί επίσης στην αρχή μιας νέας γραμμής, για παράδειγμα, το /^A/ δεν θα βρει το "A" στο "an A", αλλά θα βρει την πρώτη "A" στο "An A."
$ Υποδεικνύει το τέλος των δεδομένων εισόδου. Εάν έχει οριστεί η σημαία αναζήτησης πολλαπλών γραμμών, θα λειτουργεί επίσης στο τέλος της γραμμής, για παράδειγμα, το /t$/ δεν θα βρει το "t" στο "eater", αλλά θα το βρει στο "eat".
* Υποδεικνύει επανάληψη 0 ή περισσότερες φορές. Για παράδειγμα, το /bo*/ θα βρει το "boooo" στο "A ghost booooed" και το "b" στο "A bird warbled", αλλά δεν θα βρει τίποτα στο "A goat grunted".
+ Υποδεικνύει επανάληψη 1 ή περισσότερες φορές. Ισοδυναμεί με (1,). Για παράδειγμα, το /a+/ θα ταιριάζει με το "a" στο "candy" και όλο το "a" στο "caaaaaaandy".
? Υποδεικνύει ότι το στοιχείο μπορεί να υπάρχει ή να μην υπάρχει. Για παράδειγμα, το /e?le?/ θα ταιριάζει με το "el" στο "angel" και το "le" στο "angle" αν χρησιμοποιηθεί αμέσως μετά από έναν από τους ποσοτικούς δείκτες * , + , ? , ή () , στη συνέχεια καθορίζει μια "μη άπληστη" αναζήτηση (επαναλαμβάνοντας τον ελάχιστο δυνατό αριθμό φορών, στο πλησιέστερο επόμενο στοιχείο μοτίβου), σε αντίθεση με την προεπιλεγμένη λειτουργία "άπληστη", η οποία μεγιστοποιεί τον αριθμό των επαναλήψεων, ακόμη και αν το επόμενο στοιχείο μοτίβου ταιριάζει επίσης. χρησιμοποιείται στην προεπισκόπηση, η οποία περιγράφεται στον πίνακα υπό (?=) , (?!) και (?:) .
. (Το δεκαδικό σημείο) αντιπροσωπεύει οποιονδήποτε χαρακτήρα εκτός από μια νέα γραμμή: \n \r \u2028 ή \u2029. (μπορείτε να χρησιμοποιήσετε το [\s\S] για να αναζητήσετε οποιοδήποτε χαρακτήρα, συμπεριλαμβανομένων των νέων γραμμών). Για παράδειγμα, το /.n/ θα ταιριάζει με το "an" και το "on" στο "όχι, ένα μήλο είναι στο δέντρο", αλλά όχι "όχι".
(x)Βρίσκει το x και θυμάται. Αυτό ονομάζεται "αγκύλες μνήμης". Για παράδειγμα, το /(foo)/ θα βρει και θα θυμάται το "foo" στο "foo bar". Η υποσυμβολοσειρά που βρέθηκε αποθηκεύεται στον πίνακα αποτελεσμάτων αναζήτησης ή στις προκαθορισμένες ιδιότητες του αντικειμένου RegExp: $1, ..., $9. Για παράδειγμα, (abc)* - επαναλάβετε το abc 0 ή περισσότερες φορές.
(?:x)Βρίσκει το x, αλλά δεν θυμάται τι βρίσκει. Αυτό ονομάζεται «παρενθέσεις μνήμης». Η υποσυμβολοσειρά που βρέθηκε δεν αποθηκεύεται στον πίνακα αποτελεσμάτων και στις ιδιότητες RegExp, όπως όλες οι αγκύλες, συνδυάζουν ό,τι περιέχεται σε αυτά σε ένα μόνο υπομοτίβο.
x(?=y)Βρίσκει το x μόνο αν το x ακολουθείται από το y. Για παράδειγμα, το /Jack(?=Sprat)/ θα ταιριάζει με το "Jack" μόνο αν ακολουθείται από το "Sprat". Το /Jack(?=Sprat|Frost)/ θα ταιριάζει με το "Jack" μόνο αν ακολουθείται από "Sprat" ή "Frost". Ωστόσο, ούτε το "Sprat" ούτε το "Frost" θα εμφανιστούν στο αποτέλεσμα αναζήτησης.
x(?! y)Βρίσκει το x μόνο αν το x δεν ακολουθείται από το y. Για παράδειγμα, το /\d+(?!\.)/ θα ταιριάζει με έναν αριθμό μόνο εάν δεν ακολουθείται από υποδιαστολή. Το /\d+(?!\.)/.exec("3.141") θα βρει το 141, αλλά όχι το 3.141.
x|yΒρίσκει το x ή το y. Για παράδειγμα, το /green|red/ θα ταιριάζει με το "πράσινο" στο "πράσινο μήλο" και το "κόκκινο" στο "κόκκινο μήλο".
(n)Όπου n είναι θετικός ακέραιος αριθμός. Βρίσκει ακριβώς n επαναλήψεις του προηγούμενου στοιχείου. Για παράδειγμα, το /a(2)/ δεν θα βρει το "a" στο "candy", αλλά θα βρει και τα δύο a στο "caandy" και τα δύο πρώτα a στο "caaandy".
(n,)Όπου n είναι θετικός ακέραιος αριθμός. Βρίσκει n ή περισσότερες επαναλήψεις ενός στοιχείου. Για παράδειγμα, το /a(2,) δεν θα βρει το "a" στο "candy", αλλά θα βρει όλο το "a" στο "caandy" και στο "caaaaaaandy".
(n,m)Όπου n και m είναι θετικοί ακέραιοι. Να βρείτε από n έως m επαναλήψεις του στοιχείου.
Σύνολο χαρακτήρων. Βρίσκει οποιονδήποτε από τους χαρακτήρες που αναφέρονται. Μπορείτε να υποδείξετε την απόσταση χρησιμοποιώντας μια παύλα. Για παράδειγμα, - το ίδιο με . Ταιριάζει το «β» στο «στήθος» και το «α» και το «γ» στο «πόνος».
[^xyz]Οποιοσδήποτε χαρακτήρας εκτός από αυτούς που καθορίζονται στο σετ. Μπορείτε επίσης να καθορίσετε ένα διάστημα. Για παράδειγμα, το [^abc] είναι το ίδιο με το [^a-c]. Βρίσκει το "r" στο "brisket" και το "h" στο "chop".
[\σι]Βρίσκει τον χαρακτήρα backspace. (Δεν πρέπει να συγχέεται με το \b .)
\σιΒρίσκει ένα (λατινικό) όριο λέξης, όπως ένα κενό. (Δεν πρέπει να συγχέεται με το [\b]). Για παράδειγμα, το /\bn\w/ θα ταιριάζει με το "no" στο "noonday". Το /\wy\b/ θα βρει το "ly" στο "πιθανώς χθες."
\ΣΙΔεν δηλώνει όριο λέξης. Για παράδειγμα, το /\w\Bn/ θα ταιριάζει με το "on" στο "noonday" και το /y\B\w/ θα ταιριάζει με το "ye" στο "πιθανώς χθες".
\cXΌπου Χ είναι ένα γράμμα από το Α έως το Ω. Υποδεικνύει έναν χαρακτήρα ελέγχου σε μια συμβολοσειρά. Για παράδειγμα, το /\cM/ αντιπροσωπεύει τον χαρακτήρα Ctrl-M.
\ρεβρίσκει έναν αριθμό από οποιοδήποτε αλφάβητο (το δικό μας είναι Unicode). Χρησιμοποιήστε το για να βρείτε μόνο κανονικούς αριθμούς. Για παράδειγμα, το /\d/ ή // θα ταιριάζει με το "2" στο "B2 is the suite number."
\ΡΕΒρίσκει έναν μη αριθμητικό χαρακτήρα (όλα τα αλφάβητα). Το [^0-9] είναι το ισοδύναμο για κανονικούς αριθμούς. Για παράδειγμα, το /\D/ ή το /[^0-9]/ θα ταιριάζει με το "B" στο "B2 is the suite number."
\μικρόΒρίσκει οποιονδήποτε χαρακτήρα κενού διαστήματος, συμπεριλαμβανομένου του διαστήματος, της καρτέλας, της νέας γραμμής και άλλων χαρακτήρων κενού διαστήματος Unicode. Για παράδειγμα, το /\s\w*/ θα ταιριάζει με το "bar" στο "foo bar".
\ΜΙΚΡΟΒρίσκει οποιονδήποτε χαρακτήρα εκτός από το κενό διάστημα. Για παράδειγμα, το /\S\w*/ θα ταιριάζει με το "foo" στο "foo bar".
\vΧαρακτήρας κάθετης καρτέλας.
\wΒρίσκει οποιονδήποτε χαρακτήρα λέξης (λατινικό αλφάβητο), συμπεριλαμβανομένων γραμμάτων, αριθμών και υπογράμμισης. Ισοδύναμος. Για παράδειγμα, το /\w/ θα ταιριάζει με το "a" στο "apple", το "5" στο "$5,28" και το "3" στο "3D".
Βρίσκει οποιονδήποτε μη (λατινικό) λεκτικό χαρακτήρα. Ισοδυναμεί με [^A-Za-z0-9_] . Για παράδειγμα, τα /\W/ και /[^$A-Za-z0-9_]/ θα ταιριάζουν εξίσου με το "%" στο "50%".

Εργασία με κανονικές εκφράσεις σε Javascript

Η εργασία με κανονικές εκφράσεις σε Javascript υλοποιείται με μεθόδους της κλάσης String

exec(regexp) - βρίσκει όλες τις αντιστοιχίσεις (εγγραφές στο κανονικό μοτίβο) σε μια συμβολοσειρά. Επιστρέφει έναν πίνακα (αν υπάρχει αντιστοιχία) και ενημερώνει την ιδιότητα regexp ή μηδενίζει εάν δεν βρεθεί τίποτα. Με τον τροποποιητή g - κάθε φορά που καλείται αυτή η συνάρτηση, θα επιστρέψει την επόμενη αντιστοίχιση μετά την εύρεση της προηγούμενης - αυτό υλοποιείται με τη διατήρηση ενός ευρετηρίου μετατόπισης της τελευταίας αναζήτησης.

match(regexp) - βρείτε μέρος μιας συμβολοσειράς χρησιμοποιώντας ένα μοτίβο. Εάν έχει καθοριστεί ο τροποποιητής g, τότε η match() επιστρέφει έναν πίνακα όλων των αντιστοιχιών ή null (και όχι έναν κενό πίνακα). Χωρίς τον τροποποιητή g, αυτή η συνάρτηση λειτουργεί όπως exec();

test(regexp) - η συνάρτηση ελέγχει μια συμβολοσειρά για αντιστοίχιση ενός μοτίβου. Επιστρέφει true αν υπάρχει αντιστοίχιση και false αν δεν υπάρχει αντιστοίχιση.

split(regexp) - Διαχωρίζει τη συμβολοσειρά που καλείται σε έναν πίνακα υποσυμβολοσειρών, χρησιμοποιώντας το όρισμα ως οριοθέτη.

αντικατάσταση(regexp, mix) - η μέθοδος επιστρέφει μια τροποποιημένη συμβολοσειρά σύμφωνα με το πρότυπο (κανονική έκφραση). Η πρώτη παράμετρος στο regexp μπορεί επίσης να είναι μια συμβολοσειρά και όχι μια τυπική έκφραση. Χωρίς τον τροποποιητή g, η μέθοδος στη γραμμή αντικαθιστά μόνο την πρώτη εμφάνιση. με τον τροποποιητή g - συμβαίνει μια καθολική αντικατάσταση, π.χ. όλες οι εμφανίσεις σε μια δεδομένη γραμμή αλλάζουν.

mix - πρότυπο αντικατάστασης, μπορεί να δεχτεί τις τιμές μιας συμβολοσειράς, προτύπου αντικατάστασης, συνάρτησης (όνομα συνάρτησης).

Ειδικοί χαρακτήρες στη συμβολοσειρά αντικατάστασης

Αντικατάσταση μέσω λειτουργίας

Εάν καθορίσετε μια συνάρτηση ως δεύτερη παράμετρο, αυτή εκτελείται σε κάθε αντιστοίχιση. Μια συνάρτηση μπορεί να δημιουργήσει δυναμικά και να επιστρέψει μια συμβολοσειρά αντικατάστασης. Η πρώτη παράμετρος της συνάρτησης είναι η υποσυμβολοσειρά που βρέθηκε. Εάν το πρώτο όρισμα προς αντικατάσταση είναι ένα αντικείμενο RegExp, τότε οι επόμενες n παράμετροι περιέχουν αντιστοιχίσεις ένθετων παρενθέσεων. Οι δύο τελευταίες παράμετροι είναι η θέση στη γραμμή όπου έγινε ο αγώνας και η ίδια η γραμμή.

Η κλάση RegExp στο JavaScript είναι μια κανονική έκφραση - ένα αντικείμενο που περιγράφει ένα μοτίβο χαρακτήρων. Τα αντικείμενα RegExp δημιουργούνται συνήθως χρησιμοποιώντας την ειδική κυριολεκτική σύνταξη που παρουσιάζεται παρακάτω, αλλά μπορούν επίσης να δημιουργηθούν χρησιμοποιώντας τον κατασκευαστή RegExp().

Σύνταξη// χρησιμοποιώντας ειδική κυριολεκτική σύνταξη var regex = /pattern /flags ;// χρησιμοποιώντας τον κατασκευαστή

var regex = new RegExp("pattern", "flags"); var regex = new RegExp(/pattern /, "flags");

Τιμές παραμέτρων:

Σημαίες κανονικής έκφρασηςΣημαία
Περιγραφήσολ Σας επιτρέπει να βρείτε όλους τους αγώνες αντί να σταματήσετε μετά τον πρώτο αγώνα ().
παγκόσμια σημαία αγώναεγώ Επιτρέπει αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων ().
παράβλεψη σημαία υπόθεσηςΗ αντιστοίχιση γίνεται σε πολλές σειρές. Οι κύριοι και οι τελικοί χαρακτήρες (^ και $) υποβάλλονται σε επεξεργασία σε πολλές γραμμές, πράγμα που σημαίνει ότι η αντιστοίχιση εμφανίζεται στην αρχή ή στο τέλος κάθε γραμμής (οριοθέτες \n ή \r) και όχι μόνο στην αρχή ή στο τέλος ολόκληρης της γραμμής ( σημαία πολλαπλών γραμμών).
uΤο μοτίβο θα ερμηνευτεί ως μια ακολουθία σημείων κωδικού Unicode ( σημαία unicode).
yΗ αντιστοίχιση πραγματοποιείται στο ευρετήριο που υποδεικνύεται από την ιδιότητα lastIndex αυτής της κανονικής έκφρασης, ενώ η αντιστοίχιση δεν πραγματοποιείται σε μεταγενέστερο ή προγενέστερο ευρετήριο ( κολλώδης σημαία).

Σύνολα χαρακτήρων

Μεταχαρακτήρες

ΣύμβολοΣημαία
. Σας επιτρέπει να βρείτε έναν μεμονωμένο χαρακτήρα εκτός από έναν χαρακτήρα νέας γραμμής ή χαρακτήρα τέλους γραμμής (\n, \r, \u2028 ή \u2029).
\ρεΣας επιτρέπει να βρείτε ένα σύμβολο αριθμού στο βασικό λατινικό αλφάβητο. Ισοδυναμεί με τη χρήση του συνόλου χαρακτήρων.
\ΡΕΣας επιτρέπει να βρείτε οποιονδήποτε χαρακτήρα που δεν είναι αριθμός στο βασικό λατινικό αλφάβητο. Ισοδυναμεί με το σύνολο χαρακτήρων [^0-9].
\μικρόΣας επιτρέπει να βρείτε έναν χαρακτήρα κενού διαστήματος. Το κενό διάστημα αναφέρεται σε κενό διάστημα, καρτέλα, ροή σελίδας, ροή γραμμής και άλλους χαρακτήρες κενού διαστήματος Unicode. Ισοδύναμο με το σύνολο χαρακτήρων [\f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008 u200a​ \u2028\u2029​\u202f\u205f​\u3000].
\ΜΙΚΡΟΣας επιτρέπει να βρείτε έναν χαρακτήρα που δεν είναι κενό διάστημα. Το κενό διάστημα αναφέρεται στο διάστημα, στη καρτέλα, στη ροή σελίδων, στη ροή γραμμής και σε άλλους χαρακτήρες κενού διαστήματος Unicode. Ισοδύναμο με το σύνολο χαρακτήρων [^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2008\u2007\u20 \u200a ​\u2028\u2029​\u202f\u205f​\u3000].
[\σι]Σας επιτρέπει να βρείτε τον χαρακτήρα backspace (ειδικός χαρακτήρας \b, U+0008).
\0 Σας επιτρέπει να βρείτε το σύμβολο 0 (μηδέν).
\nΣας επιτρέπει να βρείτε τον χαρακτήρα νέας γραμμής.
\φάΣας επιτρέπει να βρείτε τον χαρακτήρα τροφοδοσίας σελίδας.
\rΣας επιτρέπει να βρείτε τον χαρακτήρα επιστροφής μεταφοράς.
\ tΣας επιτρέπει να βρείτε τον χαρακτήρα της οριζόντιας καρτέλας.
\vΣας επιτρέπει να βρείτε τον χαρακτήρα κάθετης καρτέλας.
\wΣας επιτρέπει να βρείτε οποιονδήποτε αλφαριθμητικό χαρακτήρα στο βασικό λατινικό αλφάβητο, συμπεριλαμβανομένων των υπογραμμών. Ισοδύναμο με το σύνολο χαρακτήρων.
Σας επιτρέπει να βρείτε οποιονδήποτε χαρακτήρα που δεν είναι χαρακτήρας από το βασικό λατινικό αλφάβητο. Ισοδυναμεί με το σύνολο χαρακτήρων [^a-Za-z0-9_].
\cXΣας επιτρέπει να βρείτε έναν χαρακτήρα ελέγχου σε μια συμβολοσειρά. Όπου X είναι το γράμμα από το A έως το Z. Για παράδειγμα, το /\cM/ αντιπροσωπεύει τον χαρακτήρα Ctrl-M.
\xhhΣας επιτρέπει να βρείτε έναν χαρακτήρα χρησιμοποιώντας μια δεκαεξαδική τιμή (hh είναι μια διψήφια δεκαεξαδική τιμή).
\ουχχχΣας επιτρέπει να βρείτε έναν χαρακτήρα χρησιμοποιώντας κωδικοποίηση UTF-16 (το hhhh είναι μια τετραψήφια δεκαεξαδική τιμή).
\u(hhhh) ή
\u(χχχχ)
Σας επιτρέπει να βρείτε έναν χαρακτήρα με τιμή Unicode U+hhhh ή U+hhhhh (δεκαεξαδική τιμή). Μόνο όταν δοθεί η σημαία u.
\ Υποδεικνύει ότι ο παρακάτω χαρακτήρας είναι ειδικός και δεν πρέπει να ερμηνεύεται κυριολεκτικά. Για χαρακτήρες που συνήθως ερμηνεύονται με ειδικό τρόπο, ορίζει ότι ο παρακάτω χαρακτήρας δεν είναι ειδικός και πρέπει να ερμηνεύεται κυριολεκτικά.

Περιορισμοί

Ποσοτικοί δείκτες

ΣύμβολοΣημαία
n*Η αντιστοίχιση εμφανίζεται σε οποιαδήποτε συμβολοσειρά που περιέχει μηδέν ή περισσότερες εμφανίσεις του χαρακτήρα n.
n+Η αντιστοίχιση γίνεται με οποιαδήποτε συμβολοσειρά που περιέχει τουλάχιστον έναν χαρακτήρα n.
n;Η αντιστοίχιση εμφανίζεται σε οποιαδήποτε συμβολοσειρά με προηγούμενο στοιχείο nμηδέν ή μία φορά.
n(x)Ταιριάζει με οποιαδήποτε συμβολοσειρά που περιέχει μια ακολουθία χαρακτήρων nορισμένες φορές x. Χ
n(x,) xεμφανίσεις του προηγούμενου στοιχείου n. Χπρέπει να είναι θετικός ακέραιος αριθμός.
n(x, y)Ταιριάζει με οποιαδήποτε συμβολοσειρά που περιέχει τουλάχιστον x, αλλά όχι περισσότερο από με yεμφανίσεις του προηγούμενου στοιχείου n. ΧΚαι yπρέπει να είναι θετικοί ακέραιοι αριθμοί.
n*;
n+;
n??
n(x);
n(x,);
n(x,y);
Η σύγκριση γίνεται κατ' αναλογία με τους ποσοτικούς δείκτες *, +, ? και (...), ωστόσο, η αναζήτηση γίνεται για την ελάχιστη δυνατή σύγκριση. Η προεπιλογή είναι η λειτουργία "άπληστη", ? στο τέλος του ποσοτικού δείκτη σάς επιτρέπει να ορίσετε μια λειτουργία "μη άπληστη" στην οποία η σύγκριση επαναλαμβάνεται τον ελάχιστο δυνατό αριθμό φορών.
x(?=y)Σας επιτρέπει να συγκρίνετε x, μόνο αν για x πρέπει y.
x(?! y)Σας επιτρέπει να συγκρίνετε x, μόνο αν για x δεν θα έπρεπε y.
x|yΗ σύγκριση γίνεται με οποιαδήποτε από τις καθορισμένες εναλλακτικές λύσεις.

Ομαδοποίηση και backlinks

ΣύμβολοΣημαία
(x)Σας επιτρέπει να βρείτε ένα σύμβολο xκαι θυμηθείτε το αποτέλεσμα της σύγκρισης («αποτύπωση παρενθέσεων»). Η αντιστοιχισμένη υποσυμβολοσειρά μπορεί να κληθεί από τα προκύπτοντα στοιχεία πίνακα ..., [n] ή από τις ιδιότητες του προκαθορισμένου αντικειμένου RegExp $1 ..., $9.
(?:x)Σας επιτρέπει να βρείτε ένα σύμβολο x, αλλά δεν θυμάται το αποτέλεσμα του αγώνα («παρένθεση χωρίς σύλληψη»). Η αντιστοιχισμένη υποσυμβολοσειρά δεν μπορεί να κληθεί από τα προκύπτοντα στοιχεία πίνακα ..., [n] ή από τις ιδιότητες του προκαθορισμένου αντικειμένου RegExp $1 ..., $9.
\nΜια αναφορά επιστροφής στην τελευταία υποσυμβολοσειρά που ταιριάζει με την nη στην παρένθεση σε μια κανονική έκφραση (η αρίθμηση των παρενθέσεων πηγαίνει από αριστερά προς τα δεξιά). nπρέπει να είναι θετικός ακέραιος αριθμός.

JavaScript regexp είναι ένας τύπος αντικειμένου που χρησιμοποιείται για την αντιστοίχιση ακολουθιών χαρακτήρων σε συμβολοσειρές.

Δημιουργία της πρώτης κανονικής έκφρασης

Υπάρχουν δύο τρόποι για να δημιουργήσετε μια τυπική έκφραση: χρησιμοποιώντας μια τυπική έκφραση κυριολεκτικά ή χρησιμοποιώντας ένα εργαλείο δημιουργίας κανονικών εκφράσεων. Κάθε ένα από αυτά αντιπροσωπεύει το ίδιο μοτίβο: το σύμβολο " ντο", ακολουθούμενη από " ένα"και μετά το σύμβολο" t».

// Η τυπική έκφραση κυριολεκτικά περικλείεται σε κάθετες (/)
var option1 = /cat/;
// Κατασκευαστής κανονικών εκφράσεων
var option2 = new RegExp("cat");

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

Μέθοδος RegExp.prototype.test().

Θυμάστε όταν είπα ότι οι κανονικές εκφράσεις είναι αντικείμενα; Αυτό σημαίνει ότι έχουν μια σειρά από μεθόδους. Η απλούστερη μέθοδος είναι η JavaScript τεστ regexpπου επιστρέφει μια boolean τιμή:

True: Η συμβολοσειρά περιέχει ένα τυπικό μοτίβο έκφρασης.

Λάθος: Δεν βρέθηκε αντιστοιχία.

console.log(/cat/.test("η γάτα λέει νιαούρισμα"));
// δεξιά
console.log(/cat/.test("ο σκύλος λέει ότι γαβγίζει"));
// λάθος

Φύλλο εξαπάτησης βασικών κανονικών εκφράσεων

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

Σύμβολα

  • .
  • – (κουκκίδα) αντιστοιχεί σε οποιονδήποτε μεμονωμένο χαρακτήρα με εξαίρεση τις αλλαγές γραμμής.
  • *  –  ταιριάζει με την προηγούμενη έκφραση, η οποία επαναλαμβάνεται 0 ή περισσότερες φορές.
  • +  –  ταιριάζει με μια προηγούμενη έκφραση που επαναλαμβάνεται 1 ή περισσότερες φορές. ?);
  • – η προηγούμενη έκφραση είναι προαιρετική (
  • ταιριάζει 0 ή 1 φορά

^ – αντιστοιχεί στην αρχή της γραμμής.

  • $ – ταιριάζει με το τέλος της γραμμής.Ομάδες χαρακτήρων
  • ρε– αντιστοιχεί σε οποιονδήποτε μεμονωμένο αριθμητικό χαρακτήρα.
  • [w– αντιστοιχεί σε οποιονδήποτε χαρακτήρα (αριθμός, γράμμα ή κάτω παύλα). .
  • [XYZ]  – ένα σύνολο χαρακτήρων. Ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα από το σύνολο που καθορίζεται στις παρενθέσεις. Μπορείτε επίσης να καθορίσετε εύρη χαρακτήρων, για παράδειγμα,
  • [^XYZ ]+  – αντιστοιχεί σε χαρακτήρα από ένα σύνολο που επαναλαμβάνεται μία ή περισσότερες φορές.

Α-Ω]

  – Μέσα σε ένα σύνολο χαρακτήρων, το "^" χρησιμοποιείται ως άρνηση. Σε αυτό το παράδειγμα, το μοτίβο ταιριάζει με οτιδήποτε δεν είναι κεφαλαίο. Σημαίες:Υπάρχουν πέντε προαιρετικές σημαίες στο regexp JavaScript. Μπορούν να χρησιμοποιηθούν χωριστά ή μαζί και τοποθετούνται μετά την κάθετη κλεισίματος. Για παράδειγμα: /[

Περιγραφή– παγκόσμια αναζήτηση.

εγώ  – αναζήτηση χωρίς διάκριση πεζών-κεφαλαίων.

Πρόσθετα σχέδια

(x)  –  σύλληψη παρενθέσεων. Αυτή η έκφραση ταιριάζει με το x και θυμάται αυτήν την αντιστοίχιση, ώστε να μπορείτε να τη χρησιμοποιήσετε αργότερα.

(?:x)  – παρενθέσεις χωρίς σύλληψη. Η έκφραση ταιριάζει με το x αλλά δεν θυμάται την αντιστοίχιση.

Ταιριάζει με το x μόνο αν ακολουθείται από το y.

Ας δοκιμάσουμε το υλικό που μελετήσαμε

Αρχικά, ας δοκιμάσουμε όλα τα παραπάνω. Ας υποθέσουμε ότι θέλουμε να ελέγξουμε μια συμβολοσειρά για τυχόν αριθμούς. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε την κατασκευή "d".

console.log(/d/.test("12-34"));
// δεξιά

Ο παραπάνω κωδικός επιστρέφει true αν υπάρχει τουλάχιστον ένα ψηφίο στη συμβολοσειρά. Τι να κάνετε εάν πρέπει να ελέγξετε μια συμβολοσειρά για συμμόρφωση με τη μορφή; Μπορείτε να χρησιμοποιήσετε πολλούς χαρακτήρες "d" για να ορίσετε τη μορφή:

console.log(/dd-dd/.test("12-34"));
//δικαίωμα
console.log(/dd-dd/.test("1234"));
//λανθασμένος

Εάν δεν σας ενδιαφέρει πώς εμφανίζονται οι αριθμοί πριν και μετά το σύμβολο "-" στο JavaScript regexp online, μπορείτε να χρησιμοποιήσετε το σύμβολο "+" για να δείξετε ότι το μοτίβο "d" εμφανίζεται μία ή περισσότερες φορές:

console.log(/d+-d+/.test("12-34"));
// δεξιά
console.log(/d+-d+/.test("1-234"));
// δεξιά
console.log(/d+-d+/.test("-34"));
// λάθος

Για απλότητα, μπορείτε να χρησιμοποιήσετε παρενθέσεις για να ομαδοποιήσετε εκφράσεις. Ας πούμε ότι έχουμε μια γάτα να νιαουρίζει και θέλουμε να ελέγξουμε το σχέδιο " νιαούρισμα"(νιαούρισμα):

console.log(/me+(ow)+w/.test("meeeeowowoww"));
// δεξιά

Τώρα ας το καταλάβουμε.

m => αντιστοιχίστε ένα γράμμα "m";

e + => ταιριάζει με το γράμμα "e" μία ή περισσότερες φορές.

(ow) + => ταιριάζει με τα γράμματα "ow" μία ή περισσότερες φορές.

w => ταιριάζει με το γράμμα 'w';

'm' + 'eeee' + 'owowow' + 'w'.

Όταν τελεστές όπως το "+" χρησιμοποιούνται αμέσως μετά τις παρενθέσεις, επηρεάζουν ολόκληρο το περιεχόμενο των παρενθέσεων.

Χειριστής"; " Υποδεικνύει ότι ο προηγούμενος χαρακτήρας είναι προαιρετικός. Όπως θα δείτε παρακάτω, και οι δύο περιπτώσεις δοκιμής επιστρέφουν true επειδή οι χαρακτήρες "s" επισημαίνονται ως προαιρετικοί.

console.log(/cats? say?/i.test("the Cat λέει meow"));
//δικαίωμα
console.log(/cats? say?/i.test("the Cats say meow"));
//δικαίωμα

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

var slashSearch = ///;
var questionSearch = /?/;

  • $ – ταιριάζει με το τέλος της γραμμής.είναι το ίδιο με το : κάθε κατασκευή αντιστοιχεί σε ένα ψηφιακό σύμβολο.
  • ρε– αυτό είναι το ίδιο με [ A —Za —z 0-9_]: Και οι δύο εκφράσεις ταιριάζουν με οποιονδήποτε αλφαριθμητικό χαρακτήρα ή υπογράμμιση.

Παράδειγμα: προσθήκη διαστημάτων σε γραμμές σε στυλ καμήλας

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

removeCc("camelCase") // => θα πρέπει να επιστρέψει "camel Case"

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

Αυτό ταιριάζει με τον χαρακτήρα "C" στο "camelCase"

Τώρα, πώς να προσθέσετε ένα κενό πριν από το "C";

Πρέπει να χρησιμοποιήσουμε σαγηνευτικές παρενθέσεις! Σας επιτρέπουν να βρείτε ένα ταίρι και να το θυμηθείτε για να το χρησιμοποιήσετε αργότερα! Χρησιμοποιήστε αγκύλες για να θυμάστε το κεφαλαίο γράμμα που βρίσκετε:

Μπορείτε να αποκτήσετε πρόσβαση στην τιμή που καταγράφηκε αργότερα ως εξής:

Παραπάνω χρησιμοποιούμε $1 για πρόσβαση στην τιμή που καταγράφηκε. Παρεμπιπτόντως, αν είχαμε δύο σετ παρενθέσεων λήψης, θα χρησιμοποιούσαμε $1 και $2 για να αναφερθούμε στις τιμές που καταγράφηκαν και ομοίως για περισσότερες παρενθέσεις λήψης.

Εάν πρέπει να χρησιμοποιήσετε παρενθέσεις αλλά δεν χρειάζεται να καταγράψετε αυτήν την τιμή, μπορείτε να χρησιμοποιήσετε παρενθέσεις που δεν καταγράφουν: (?: x ). Σε αυτήν την περίπτωση, βρίσκεται μια αντιστοίχιση με το x, αλλά δεν απομνημονεύεται.

Ας επιστρέψουμε στην τρέχουσα εργασία. Πώς εφαρμόζουμε παρενθέσεις λήψης; Χρησιμοποιώντας τη μέθοδο αντικατάστασης regexp JavaScript! Περνάμε το "$1" ως δεύτερο όρισμα. Είναι σημαντικό να χρησιμοποιείτε εισαγωγικά εδώ.

συνάρτηση removeCc(str)(
return str.replace(/()/g, "$1");
}


Ας δούμε ξανά τον κώδικα. Πιάνουμε το κεφαλαίο γράμμα και μετά το αντικαθιστούμε με το ίδιο γράμμα. Μέσα στα εισαγωγικά, εισαγάγετε ένα κενό διάστημα ακολουθούμενο από τη μεταβλητή $1 . Ως αποτέλεσμα, παίρνουμε ένα κενό μετά από κάθε κεφαλαίο γράμμα.

συνάρτηση removeCc(str)(
return str.replace(/()/g, "$1");
}
removeCc("camelCase") // "camel Case"
removeCc("helloWorldItIsMe") // "hello World It Is Me"

Παράδειγμα: αφαίρεση κεφαλαίων γραμμάτων

Τώρα έχουμε μια συμβολοσειρά με ένα σωρό περιττά κεφαλαία γράμματα. Έχετε καταλάβει πώς να τα αφαιρέσετε; Αρχικά, πρέπει να επιλέξουμε όλα τα κεφαλαία γράμματα. Στη συνέχεια αναζητούμε ένα σύνολο χαρακτήρων χρησιμοποιώντας τον καθολικό τροποποιητή:

Θα χρησιμοποιήσουμε ξανά τη μέθοδο αντικατάστασης, αλλά πώς κάνουμε τον χαρακτήρα πεζό αυτή τη φορά;

συνάρτηση πεζά(str)(
return str.replace(//g, ???);
}


Συμβουλή: Στη μέθοδο αντικατάστασης(), μπορείτε να καθορίσετε μια συνάρτηση ως δεύτερη παράμετρο.

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

συνάρτηση πεζά(str)(
return str.replace(//g, (u) => u.toLowerCase());
}
smallCase("camel Case") // "camel case"
smallCase("hello World It Is Me") // "Hello World It Is Me"

Παράδειγμα: μετατρέψτε το πρώτο γράμμα σε κεφαλαίο

capitalize("camel case") // => θα πρέπει να επιστρέψει "Camel case"

Ας χρησιμοποιήσουμε ξανά τη συνάρτηση στη μέθοδο replace().

Ωστόσο, αυτή τη φορά χρειάζεται μόνο να αναζητήσουμε τον πρώτο χαρακτήρα στη συμβολοσειρά. Θυμηθείτε ότι το σύμβολο "^" χρησιμοποιείται για αυτό.

Ας μείνουμε για λίγο στο σύμβολο "^". Θυμηθείτε το παράδειγμα που δόθηκε προηγουμένως:
//δικαίωμα

console.log(/cat/.test("η γάτα λέει νιαούρισμα"));

Όταν προσθέτετε έναν χαρακτήρα "^", η συνάρτηση δεν επιστρέφει πλέον true επειδή η λέξη "cat" δεν βρίσκεται στην αρχή της γραμμής.

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

- αυτή είναι μια οδηγία που περιγράφει σε μια ειδικά αναπτυγμένη γλώσσα (RegExp) τον νόμο της «ομοιότητας» της επιθυμητής συμβολοσειράς με το μοτίβο.

  • Σε τι χρησιμεύει αυτό; Για παράδειγμα:
  • Για να οργανώσετε μια αναζήτηση για κάτι στο κείμενο.
  • Για να αντικαταστήσετε ένα μέρος των υποσυμβολοσειρών με άλλα.

Για να ελέγξετε την ορθότητα της εισαγωγής του χρήστη (πιθανότατα έχετε συναντήσει μια κατάσταση περισσότερες από μία φορές όταν εισαγάγατε τη διεύθυνση email σας σε κάποια μορφή και λάβατε ένα σφάλμα όπως "Μη έγκυρο email").

Δεν θα μπούμε σε λεπτομέρειες, αλλά ας δούμε πώς να ορίσουμε κανονικές εκφράσεις. Υπάρχουν δύο τρόποι, σε αυτό το μάθημα θα εξετάσουμε έναν (δημιουργία σε κυριολεκτική σημειογραφία):

Var p=/pattern/flags;
πρότυποΟπου
- ένα μοτίβο είναι η βάση μιας κανονικής έκφρασης που ορίζει κριτήρια αντιστοίχισης συμβολοσειρών. Αποτελείται από κυριολεκτικά και μεταχαρακτήρες.σημαίες

- σημαίες (τροποποιητές) που καθορίζουν πρόσθετες παραμέτρους αντιστοίχισης προτύπου.

Var par=/+/i; + Εδώ

- ένα πρότυπο, που σημαίνει κυριολεκτικά το ακόλουθο "οποιοσδήποτε αριθμός αριθμών και γραμμάτων 1 ή περισσότερες φορές" (θα δούμε πώς να ορίσουμε ένα πρότυπο παρακάτω).

Για να γίνει πιο σαφές για τι μιλάμε, ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε μια φόρμα όπου ο χρήστης εισάγει το email και τον κωδικό πρόσβασής του. Θέλουμε όταν κάνετε κλικ στο κουμπί "Εγγραφή", η εισαγωγή να ελέγχεται για ορθότητα.

Ο κώδικας της σελίδας HTML θα είναι ο εξής:

Κανονικές εκφράσεις Javascript

Φόρμα εγγραφής



Τι πρέπει λοιπόν να κάνει η συνάρτηση; prov_address()? Για να ξεκινήσουμε, χρειαζόμαστε δύο μεταβλητές στις οποίες θα τοποθετήσουμε τις τιμές που εισάγει ο χρήστης:

συνάρτηση prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; )

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

συνάρτηση prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; var adr_pattern=/+@+\.(2,5)/i; var par_pattern=/+/i; )

Τώρα ελέγχουμε για αντιστοίχιση μοτίβων. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε τη μέθοδο δοκιμήαντικείμενο RegExp:

συνάρτηση prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; var adr_pattern=/+@+\.(2,5)/i; var par_pattern=/+/i; var prov=adr_pattern.test(adr var prov1=par_pattern.test(par);

Γραμμή adr_pattern.test(adr)σημαίνει το εξής: έλεγχος ύπαρξης σε συμβολοσειρά adrακολουθία που ταιριάζει με την κανονική έκφραση adr_pattern. Μέθοδος δοκιμήεπιστρέφει μια boolean τιμή (true ή false).

Το μόνο που έχουμε να κάνουμε είναι να υποδείξουμε στη λειτουργία μας τι πρέπει να κάνουμε σε περίπτωση επιτυχούς (ή αποτυχημένου) ελέγχου:

συνάρτηση prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; var adr_pattern=/+@+\.(2,5)/i; var par_pattern=/+/i; var prov=adr_pattern.test(adr var prov1=par_pattern.test(par if (prov==true && prov1==true) (alert("Είσαι εγγεγραμμένος!"); Τα δεδομένα που εισήχθησαν είναι λανθασμένα!"); ))

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

Ας πάρουμε μια κανονική έκφραση για τον κωδικό πρόσβασής μας - /+/i:

  • /+/ - ένα πρότυπο στο οποίο:
    • 0-9 - οποιοδήποτε αριθμό.

    • a-z- οποιοδήποτε πεζό γράμμα από το a έως το z.

    • - Οι αγκύλες σημαίνουν ότι το μοτίβο μπορεί να περιέχει οποιοδήποτε από τα κυριολεκτικά που αναφέρονται σε αυτά (στην περίπτωσή μας, αριθμούς και πεζά γράμματα)

    • + - υποδεικνύει ότι αυτό το μέρος του σχεδίου (δηλαδή, αυτό που βρίσκεται σε αγκύλες) μπορεί να επαναληφθεί μία ή περισσότερες φορές.


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

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

Για παράδειγμα, εάν ο χρήστης εισάγει "2", "a3b" ή "leopard" στο πεδίο κωδικού πρόσβασης, τότε ένας τέτοιος κωδικός πρόσβασης θα θεωρείται σωστός. Και αν εισάγει "ab&s" ή "24;", τότε ένας τέτοιος κωδικός πρόσβασης δεν θα θεωρείται σωστός, γιατί περιέχει ειδικούς χαρακτήρες και δεν τους επιτρέψαμε στην κανονική έκφραση.

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

Ας ξεκινήσουμε με το πιο απλό πράγμα - κυριολεκτικά:

  • Κάθε ένα από αυτά τα σύμβολα αντιπροσωπεύει τον εαυτό του. Για παράδειγμα, /abc/ - μόνο η συμβολοσειρά "abc" ταιριάζει με αυτό το μοτίβο.

  • a-z- όλα τα πεζά γράμματα από το a έως το z. Για παράδειγμα, /a-z/ - αυτό το μοτίβο ταιριάζει με 26 συμβολοσειρές: "a", "b", "c"... "z"

  • Α-Ζ- όλα τα κεφαλαία γράμματα από το Α έως το Ω.

  • 0-9 - όλοι οι αριθμοί.

Εάν θέλουμε να υποδείξουμε ότι μπορεί να υπάρχουν πολλοί αριθμοί ή γράμματα, θα πρέπει να χρησιμοποιήσουμε χαρακτήρες ελέγχου:
  • * - υποδηλώνει ότι ο χαρακτήρας (ή μέρος του μοτίβου, εάν περικλείεται σε αγκύλες) μπορεί να επαναληφθεί 0 ή περισσότερες φορές. Για παράδειγμα, /ab*c/ - σημαίνει ότι η γραμμή αρχίζει με τον χαρακτήρα a, τότε μπορεί να υπάρχει οποιοσδήποτε αριθμός b χαρακτήρων, ακολουθούμενος από τον χαρακτήρα c. Εκείνοι. αυτές θα μπορούσαν να είναι, για παράδειγμα, οι ακόλουθες συμβολοσειρές: "ac", "abc", "abbbbbbc", κ.λπ.

  • + - υποδηλώνει ότι ο χαρακτήρας (ή μέρος του μοτίβου, εάν περικλείεται σε αγκύλες) μπορεί να επαναληφθεί 1 ή περισσότερες φορές. Για παράδειγμα, /ab+c/ - σημαίνει ότι η γραμμή αρχίζει με τον χαρακτήρα a, τότε μπορεί να υπάρχει οποιοσδήποτε αριθμός b χαρακτήρων (αλλά όχι μικρότερος από 1), ακολουθούμενος από τον χαρακτήρα c. Εκείνοι. αυτές θα μπορούσαν να είναι, για παράδειγμα, οι ακόλουθες συμβολοσειρές: "abc", "abbbbbbc", κ.λπ.

  • . - υποδηλώνει ότι αυτό το μέρος μπορεί να περιέχει οποιονδήποτε μεμονωμένο χαρακτήρα εκτός από έναν χαρακτήρα νέας γραμμής.

  • ? Για παράδειγμα, για το μοτίβο /ab.c/ οι ακόλουθες συμβολοσειρές είναι συγκρίσιμες: "ab6c", "abxc", "ab=c", κ.λπ.

  • - υποδηλώνει ότι ο χαρακτήρας (ή μέρος του μοτίβου, εάν περικλείεται σε αγκύλες) μπορεί να επαναληφθεί 0 ή 1 φορά. Για παράδειγμα, /ab?c/ - σημαίνει ότι η γραμμή αρχίζει με τον χαρακτήρα a, τότε μπορεί να υπάρχει ή όχι ένας χαρακτήρας b, ακολουθούμενος από τον χαρακτήρα c. Εκείνοι. αυτές θα μπορούσαν να είναι οι ακόλουθες συμβολοσειρές: "ac", "abc"- υποδηλώνει ότι ο χαρακτήρας (ή μέρος του μοτίβου, εάν περικλείεται σε αγκύλες) μπορεί να επαναληφθεί ακριβώς n φορές. Για παράδειγμα, /ab(3)c/ - σημαίνει ότι η γραμμή αρχίζει με τον χαρακτήρα a, μετά υπάρχουν 3 χαρακτήρες b, ακολουθούμενοι από τον χαρακτήρα c. Εκείνοι. αυτή θα είναι η συμβολοσειρά "abbbc".

  • (n,)- υποδηλώνει ότι ο χαρακτήρας (ή μέρος του μοτίβου, εάν περικλείεται σε αγκύλες) μπορεί να επαναληφθεί n ή περισσότερες φορές. Για παράδειγμα, /ab(3,)c/ - σημαίνει ότι η γραμμή αρχίζει με τον χαρακτήρα a, μετά υπάρχουν 3 ή περισσότεροι χαρακτήρες b, ακολουθούμενοι από τον χαρακτήρα c. Εκείνοι. αυτές θα μπορούσαν να είναι οι ακόλουθες συμβολοσειρές: "abbbc", "abbbbbbbc", κ.λπ.

  • (n, m)- υποδηλώνει ότι ο χαρακτήρας (ή μέρος του μοτίβου, εάν περικλείεται σε αγκύλες) μπορεί να επαναληφθεί n έως m φορές. Για παράδειγμα, /ab(1,3)c/ - σημαίνει ότι η γραμμή αρχίζει με τον χαρακτήρα a, μετά υπάρχουν 1 έως 3 χαρακτήρες b, ακολουθούμενοι από τον χαρακτήρα c. Εκείνοι. αυτές θα μπορούσαν να είναι οι ακόλουθες συμβολοσειρές: "abc", "abbc", "abbc".

  • - ένα τέτοιο μοτίβο είναι συγκρίσιμο με οποιονδήποτε μεμονωμένο χαρακτήρα που ανήκει στο σύνολο που ορίζεται σε παρένθεση. Ένα σύνολο καθορίζεται με μια απαρίθμηση ή με τον καθορισμό μιας περιοχής. Για παράδειγμα, το μοτίβο // μπορεί να αντιστοιχιστεί με τις ακόλουθες συμβολοσειρές: "a", "b", "c".

  • [^] - ένα τέτοιο μοτίβο είναι συγκρίσιμο με οποιονδήποτε μεμονωμένο χαρακτήρα που δεν ανήκει στο σύνολο που ορίζεται σε παρένθεση. Για παράδειγμα, το μοτίβο /[^abc]/ μπορεί να ταιριάζει με τις συμβολοσειρές: "f", "x", "Z", αλλά δεν μπορεί να ταιριάζει με τις συμβολοσειρές: "a", "b", "c".

  • ^ - υποδηλώνει ότι οι χαρακτήρες είναι συγκρίσιμοι με την αρχή της γραμμής. Για παράδειγμα, το μοτίβο /^abc/ μπορεί να ταιριάζει με τις συμβολοσειρές: "abcd", "abcfh", αλλά δεν μπορεί να ταιριάζει με τις συμβολοσειρές: "dabc", "cbabc", κ.λπ.

  • $ - υποδηλώνει ότι οι χαρακτήρες ταιριάζουν με το τέλος της συμβολοσειράς. Για παράδειγμα, το μοτίβο /abc$/ μπορεί να ταιριάζει με τις συμβολοσειρές: "dabc", "fhabc", αλλά δεν μπορεί να ταιριάζει με τις συμβολοσειρές: "abcd", "abccb" κ.λπ.

  • | - υποδεικνύει πολλά εναλλακτικά μοτίβα. Για παράδειγμα, το μοτίβο /ab|c/ θα ταιριάζει με τις ακόλουθες συμβολοσειρές: "ab" και "c".

  • \ - χρησιμεύει για τη διαφυγή ειδικών χαρακτήρων, π.χ. μια ανάστροφη κάθετο πριν από έναν χαρακτήρα υποδεικνύει ότι πρέπει να ερμηνευθεί ως ειδικός. Για παράδειγμα:
    • \ρε- ταιριάζει με οποιονδήποτε αριθμό από το 0 έως το 9.

    • \ΡΕ- όλα ταιριάζουν εκτός από τον αριθμό.

    • \μικρό- αντιστοιχεί σε χώρο.

    • \ΜΙΚΡΟ- ταιριάζει με όλα εκτός από ένα διάστημα.

    • \w- ταιριάζει με ένα γράμμα, έναν αριθμό ή μια υπογράμμιση.

    • - ταιριάζει με όλα εκτός από ένα γράμμα, έναν αριθμό ή μια υπογράμμιση.


  • Για παράδειγμα, το μοτίβο /x\d\d/ θα ταιριάζει με τις συμβολοσειρές: "x01", "x25", κ.λπ., αλλά δεν θα ταιριάζει με τις συμβολοσειρές: "A15", "x0A"...

    Η ανάστροφη κάθετο χρησιμοποιείται επίσης για να γίνει κυριολεκτικός ένας ειδικός χαρακτήρας. Για παράδειγμα, αν χρειαστεί να βρούμε τη συμβολοσειρά "a*b", τότε θα καθορίσουμε το ακόλουθο μοτίβο /a\*b/.

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

Var adr_pattern=/+@+\.(2,5)/i;

Έτσι, καθορίσαμε ότι η διεύθυνση ηλεκτρονικού ταχυδρομείου έχει αριθμούς, γράμματα και υπογράμμιση 1 ή περισσότερες φορές, ακολουθούμενα από @, και στη συνέχεια αριθμούς, γράμματα και υπογράμμιση 1 ή περισσότερες φορές και μετά μια τελεία ακολουθούμενη από γράμματα από 2 έως 5 φορές. Αυτό είναι περίπου το πώς μοιάζουν οι διευθύνσεις ηλεκτρονικού ταχυδρομείου.

Τώρα, γνωρίζοντας τι ακριβώς καθορίσαμε στο δείγμα, μπορείτε να ελέγξετε τη λειτουργία του παραδείγματος:



Συνιστούμε να διαβάσετε

Κορυφή