Οι κανονικές εκφράσεις φημίζονται ότι μοιάζουν με τυχαίο θόρυβο. Ένα μοτίβο όπως το ^[\w.-]+@[\w-]+\.\w{2,}$ μπορεί να φαίνεται σαν μια γάτα να περπάτησε πάνω στο πληκτρολόγιο. Αλλά πίσω από την κρυπτική σύνταξη κρύβεται μια αξιοσημείωτα κομψή ιδέα: μια συνοπτική γλώσσα για την περιγραφή μοτίβων σε κείμενο.
Είτε επαληθεύετε εισόδους φόρμας, ψάχνετε σε αρχεία καταγραφής, καθαρίζετε δεδομένα ή κάνετε εύρεση-αντικατάσταση σε μια βάση κώδικα, το regex είναι ένα από τα πιο ευέλικτα εργαλεία στην εργαλειοθήκη ενός προγραμματιστή. Και δεν χρειάζεται να απομνημονεύσετε κάθε σπάνιο χαρακτηριστικό για να αποκτήσετε πραγματική αξία. Μια χούφτα βασικά δομικά στοιχεία καλύπτουν τη μεγάλη πλειοψηφία των πρακτικών περιπτώσεων.
Τι κάνει πραγματικά το regex
Μια κανονική έκφραση (regex ή regexp) είναι ένα μοτίβο που περιγράφει ένα σύνολο strings. Το παρέχετε σε μια μηχανή αναζήτησης — στη γλώσσα προγραμματισμού σας, τον επεξεργαστή κειμένου ή ένα εργαλείο γραμμής εντολών — και βρίσκει κάθε string που ταιριάζει.
Σκεφτείτε το ως ένα αναβαθμισμένο ερώτημα αναζήτησης:
- Κανονική αναζήτηση: βρες την ακριβή λέξη «error»
- Αναζήτηση regex: βρες οτιδήποτε μοιάζει με IP διεύθυνση, ημερομηνία, email ή οποιαδήποτε δομή μπορείτε να περιγράψετε
Το regex εφευρέθηκε από τον μαθηματικό Stephen Kleene το 1956 και εισήλθε στην πληροφορική μέσω των επεξεργαστών κειμένου του Unix στη δεκαετία του 1960. Σήμερα υποστηρίζεται σχεδόν σε κάθε γλώσσα προγραμματισμού και επεξεργαστή κειμένου.
Τα βασικά δομικά στοιχεία
Κυριολεκτικοί χαρακτήρες
Η πιο απλή κανονική έκφραση είναι απλό κείμενο. Το μοτίβο hello ταιριάζει με το string «hello» οπουδήποτε εμφανίζεται. Τίποτα περίπλοκο.
Η τελεία (.) — οποιοσδήποτε χαρακτήρας
Η τελεία ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα εκτός από αλλαγή γραμμής.
h.tταιριάζει με «hat», «hit», «hot», «h3t» και ακόμα «h t»
Κλάσεις χαρακτήρων ([])
Οι αγκύλες ορίζουν ένα σύνολο επιτρεπόμενων χαρακτήρων σε μία θέση.
[aeiou]— οποιοδήποτε φωνήεν[0-9]— οποιοδήποτε ψηφίο[A-Za-z]— οποιοδήποτε γράμμα[^0-9]— οποιοσδήποτε χαρακτήρας που ΔΕΝ είναι ψηφίο (το^μέσα σε αγκύλες σημαίνει «όχι»)
Συντομογραφίες κλάσεων
| Συντομογραφία | Σημασία | Ισοδύναμο |
|---|---|---|
\d |
Οποιοδήποτε ψηφίο | [0-9] |
\w |
Χαρακτήρας λέξης | [A-Za-z0-9_] |
\s |
Κενός χαρακτήρας | [ \t\n\r] |
\D |
Μη ψηφίο | [^0-9] |
\W |
Μη χαρακτήρας λέξης | [^A-Za-z0-9_] |
\S |
Μη κενός χαρακτήρας | [^ \t\n\r] |
Ποσοδείκτες — πόσες φορές
Οι ποσοδείκτες ελέγχουν πόσες φορές πρέπει να εμφανιστεί το προηγούμενο στοιχείο.
| Σύμβολο | Σημασία | Παράδειγμα | Ταιριάζει |
|---|---|---|---|
* |
Μηδέν ή περισσότερα | ab*c |
«ac», «abc», «abbc» |
+ |
Ένα ή περισσότερα | ab+c |
«abc», «abbc» (όχι «ac») |
? |
Μηδέν ή ένα | colou?r |
«color» και «colour» |
{3} |
Ακριβώς 3 | \d{3} |
«123», «456» |
{2,4} |
Μεταξύ 2 και 4 | \d{2,4} |
«12», «123», «1234» |
Άγκυρες — θέση
^— αρχή string (ή γραμμής, με τη σημαίαm)$— τέλος string (ή γραμμής)\b— όριο λέξης
Το μοτίβο ^\d{4}$ ταιριάζει με ένα string που είναι ακριβώς τέσσερα ψηφία, όπως «2026», αλλά όχι «abc2026» ή «2026xyz».
Ομάδες και εναλλαγή
(abc)— δεσμεύει το «abc» ως ομάδαa|b— ταιριάζει με «a» ή «b»(cat|dog)— ταιριάζει με «cat» ή «dog»
Οι ομάδες επιτρέπουν επίσης την εφαρμογή ποσοδεικτών σε ακολουθίες: (ha)+ ταιριάζει με «ha», «haha», «hahaha».
Κοινά πρακτικά μοτίβα
Επαλήθευση email (βασική)
^[\w.-]+@[\w-]+\.\w{2,}$
Αυτό ταιριάζει με user@example.com, first.last@company.co.uk (μερικώς), και απορρίπτει strings χωρίς @ ή domain.
Σημαντικό: Η τέλεια επαλήθευση email με regex είναι περίφημα δύσκολη — η πλήρης προδιαγραφή RFC 5322 είναι εξαιρετικά πολύπλοκη. Για συστήματα παραγωγής, χρησιμοποιήστε ένα βασικό regex για έλεγχο μορφής και μετά επαληθεύστε τη διεύθυνση στέλνοντας email επιβεβαίωσης.
Αντιστοίχιση αριθμού τηλεφώνου
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Διαχειρίζεται μορφές όπως +1 555 123 4567, 555-123-4567 και (555) 123-4567.
Αντιστοίχιση URL
https?://[\w.-]+(/[\w./?&=-]*)?
Ταιριάζει με https://example.com, http://example.com/path?q=hello.
Αντιστοίχιση ημερομηνίας (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
Ταιριάζει με 2026-03-29, 1999-12-31. Σημείωση: ελέγχεται μόνο η μορφή, όχι η εγκυρότητα — θα ταίριαζε επίσης με 9999-99-99.
Σημαίες που αλλάζουν τη συμπεριφορά
Οι περισσότερες μηχανές regex υποστηρίζουν σημαίες που τροποποιούν τον τρόπο εφαρμογής του μοτίβου:
| Σημαία | Όνομα | Εφέ |
|---|---|---|
g |
Global (καθολική) | Εύρεση όλων των αντιστοιχιών, όχι μόνο της πρώτης |
i |
Case-insensitive (χωρίς διάκριση πεζών-κεφαλαίων) | hello ταιριάζει με «Hello», «HELLO», κλπ. |
m |
Multiline (πολλαπλών γραμμών) | ^ και $ ταιριάζουν σε αρχή/τέλος κάθε γραμμής |
s |
Dotall | . ταιριάζει επίσης με χαρακτήρες αλλαγής γραμμής |
Σε JavaScript, οι σημαίες προστίθενται μετά την κλείσιμο κάθετο: /hello/gi. Σε Python, περνιούνται ως ορίσματα: re.findall(r"hello", text, re.IGNORECASE).
Πότε το regex είναι υπερβολή
Το regex είναι ισχυρό, αλλά δεν είναι πάντα το κατάλληλο εργαλείο:
- Ανάλυση HTML ή XML. Χρησιμοποιήστε σωστό DOM parser. Το regex δεν μπορεί να χειριστεί αξιόπιστα εμφωλευμένες ετικέτες.
- Ανάλυση JSON. Χρησιμοποιήστε
JSON.parse()ή αντίστοιχο. Το regex θα αποτύχει σε ειδικές περιπτώσεις. - Σύνθετη επαλήθευση. Αν το μοτίβο σας εκτείνεται σε πολλές γραμμές και η ανάγνωσή του απαιτεί πέντε λεπτά, σκεφτείτε να γράψετε διαδικαστικό κώδικα επαλήθευσης.
- Απλές λειτουργίες strings. Αν χρειάζεστε μόνο
startsWith(),includes()ήsplit(), οι απλές μέθοδοι string είναι πιο σαφείς και ταχύτερες.
Κοινές παγίδες
- Αμέλεια στη διαφυγή ειδικών χαρακτήρων. Η τελεία
.ταιριάζει με οποιονδήποτε χαρακτήρα. Για κυριολεκτική τελεία, χρησιμοποιήστε\.. Το ίδιο για(,),[,],+,*,?,{,},^,$,|και\. - Άπληστο έναντι τεμπέλικου ταίριασμα. Εξ ορισμού,
.*είναι άπληστο — ταιριάζει με όσο περισσότερο γίνεται. Προσθέστε?για τεμπέλικο:.*?ταιριάζει με όσο λιγότερο γίνεται. Αυτό έχει σημασία κατά την εξαγωγή περιεχομένου μεταξύ οριοθετών. - Καταστροφική οπισθοδρόμηση. Εμφωλευμένοι ποσοδείκτες όπως
(a+)+μπορεί να αναγκάσουν τη μηχανή να δοκιμάσει εκθετικό αριθμό διαδρομών σε ορισμένες εισόδους, παγώνοντας το πρόγραμμά σας. Αποφύγετε τις εμφωλευμένες επαναλήψεις σε αλληλεπικαλυπτόμενα μοτίβα. - Αμέλεια στις άγκυρες. Χωρίς
^και$, το μοτίβο σας ταιριάζει με υποσύνολα.\d{3}ταιριάζει με «123» μέσα στο «abc12345». Χρησιμοποιήστε^\d{3}$αν χρειάζεστε ακριβή αντιστοίχιση.
Μάθετε περισσότερα
Ο καλύτερος τρόπος να μάθετε regex είναι να πειραματιστείτε. Πληκτρολογήστε ένα μοτίβο, επικολλήστε κάποιο κείμενο δοκιμής και δείτε τι φωτίζεται. Ρυθμίστε και επαναλάβετε μέχρι να κατανοήσετε πώς λειτουργεί κάθε κομμάτι.
- Πώς να δοκιμάσετε μοτίβα Regex — διαδραστικός οδηγός με παραδείγματα
- Εργαλείο δοκιμής Regex — επικολλήστε το μοτίβο και τα δεδομένα δοκιμής, δείτε τις αντιστοιχίες σε πραγματικό χρόνο
