Regex Tester: έλεγχος κανονικών εκφράσεων
Πληκτρολογήστε ένα μοτίβο, επιλέξτε τις σημαίες που χρειάζεστε και επικολλήστε κείμενο. Κάθε εύρημα επισημαίνεται καθώς πληκτρολογείτε και εμφανίζεται σε λίστα με τη θέση του και τις ομάδες σύλληψης. Το μοτίβο εκτελείται στη μηχανή κανονικών εκφράσεων JavaScript του ίδιου του προγράμματος περιήγησής σας. Έτσι τα αποτελέσματα συμφωνούν με τον κώδικά σας και το κείμενο δεν φεύγει από τη συσκευή σας.
0 χαρακτήρες · 0 λέξεις · 0 γραμμές
Οι αντιστοιχίσεις επισημαίνονται εδώ.0 χαρακτήρες · 0 λέξεις · 0 γραμμές
Εκτελείται εξ ολοκλήρου σε αυτήν την καρτέλα του προγράμματος περιήγησης. Το κείμενό σας δεν ανεβαίνει ούτε αποθηκεύεται πουθενά.
Στοιχεία regex της JavaScript
Η στήλη της πρώτης αντιστοίχισης προέκυψε εκτελώντας κάθε μοτίβο στο κείμενό του με τη μηχανή JavaScript που δημιούργησε αυτή τη σελίδα.
| Token | Σημασία | Μοτίβο | Κείμενο | Πρώτη αντιστοίχιση |
|---|---|---|---|---|
\d | Ψηφίο 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | Γράμμα, ψηφίο ή κάτω παύλα (ASCII) | /\w+/ | snake_case-id | snake_case |
\s | Κενό διάστημα, συμπεριλαμβανομένων tab και αλλαγών γραμμής | /\s+/ | two spaces | |
. | Οποιοσδήποτε χαρακτήρας εκτός από αλλαγή γραμμής (εκτός αν s) | /a.c/ | abc a-c | abc |
^ $ | Αρχή και τέλος εισόδου (ή γραμμής, με m) | /^\w+$/ | single | single |
[abc] | Ένας από τους χαρακτήρες της λίστας | /[aeiou]/ | rhythm and blues | a |
[^abc] | Οποιοσδήποτε χαρακτήρας εκτός λίστας | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 ή περισσότερα, 1 ή περισσότερα, 0 ή 1 | /colou?r/ | color colour | color |
{n,m} | Από n έως m φορές | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | Ομάδα καταγραφής | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | Ονοματισμένη ομάδα καταγραφής | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | Ομάδα χωρίς καταγραφή | /(?:ab)+/ | ababab! | ababab |
a|b | Όποια από τις δύο πλευρές | /cat|dog/ | hotdog | dog |
\b | Όριο λέξης | /\bcat\b/ | concat cat | cat |
(?=…) | Ακολουθείται από (lookahead) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | Δεν προηγείται (negative lookbehind) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | Οποιοδήποτε γράμμα Unicode (απαιτεί u) | /\p{L}+/u | naïve 東京 | naïve |
Οι έξι σημαίες και τι αλλάζει η καθεμία
Το g (global) βρίσκει όλες τις αντιστοιχίσεις αντί να σταματά στην πρώτη· χωρίς αυτό η λίστα έχει μία εγγραφή. Το i αγνοεί την διάκριση πεζών-κεφαλαίων. Το m (multiline) κάνει τα ^ και $ να αντιστοιχούν στην αρχή και στο τέλος κάθε γραμμής και όχι μόνο ολόκληρου του κειμένου, κάτι που χρειάζεστε για ένα μοτίβο όπως τα κενά στο τέλος της γραμμής. Το s (dotAll, προστέθηκε στο ES2018) επιτρέπει στο . να αντιστοιχεί και σε αλλαγές γραμμής. Το u (unicode) αντιμετωπίζει το κείμενο ως code points, οπότε ένα emoji μετράει ως ένας χαρακτήρας, και ενεργοποιεί τις ακολουθίες ιδιοτήτων όπως το \p{L} για οποιοδήποτε γράμμα σε οποιοδήποτε αλφάβητο. Το y (sticky) αντιστοιχεί μόνο ακριβώς στην τρέχουσα θέση, τη λειτουργία που χρησιμοποιούν οι tokenizers. Η JavaScript έχει επίσης το d για δείκτες αντιστοίχισης και το v για πράξεις συνόλων σε κλάσεις· αυτός ο έλεγχος περιορίζεται στα έξι παραπάνω.
Κάτω από το κείμενο δοκιμής, κάθε αντιστοίχιση εμφανίζει τον δείκτη και τις ομάδες της. Οι αριθμημένες ομάδες προκύπτουν από απλές παρενθέσεις, οι ομάδες (?:…) δεν καταγράφουν, και το (?<year>\d{4}) δημιουργεί ονομασμένη ομάδα που εμφανίζεται με το όνομά της, όπως δείχνει το δείγμα ημερομηνίας ISO. Το μενού Common patterns εισάγει δοκιμασμένα σημεία εκκίνησης για διευθύνσεις email, URL, διευθύνσεις IPv4, χρώματα hex, UUID, επαναλαμβανόμενες λέξεις και κενά στο τέλος γραμμής. Αντιμετωπίστε το μοτίβο email ως γρήγορο έλεγχο και όχι ως επικύρωση: η πλήρης γραμματική των διευθύνσεων είναι πολύ πιο ανεκτική και ο μόνος πραγματικός έλεγχος είναι η αποστολή ενός μηνύματος.
Lookbehind και καταστροφική οπισθοδρόμηση (backtracking)
Τα lookarounds ελέγχουν τι περιβάλλει μια θέση χωρίς να την καταναλώνουν. Το lookahead, (?=…) και (?!…), υπάρχει πάντα στην JavaScript· το lookbehind, (?<=…) και (?<!…), ήρθε με το ES2018 και έφτασε σε όλους τους μεγάλους browsers όταν το Safari 16.4 το υποστήριξε το 2023. Έτσι το (?<=\$)\d+ βρίσκει το 42 στο "$42" χωρίς να συμπεριλάβει το σύμβολο του δολαρίου. Σε αντίθεση με πολλές άλλες μηχανές, η JavaScript επιτρέπει lookbehind οποιουδήποτε μήκους.
Η μηχανή της JavaScript χρησιμοποιεί backtracking: όταν μια διαδρομή αποτυγχάνει, γυρίζει πίσω και δοκιμάζει τις εναλλακτικές. Οι ένθετοι ποσοδείκτες, όπως το (a+)+$, της δίνουν εκθετικό αριθμό τρόπων να χωρίσει το ίδιο κείμενο, οπότε μια συμβολοσειρά με 30 a ακολουθούμενα από x μπορεί να πάρει δευτερόλεπτα και λίγα ακόμη γράμματα ώρες. Αυτό είναι το catastrophic backtracking, και στους διακομιστές γίνεται ReDoS, άρνηση υπηρεσίας· ένας μόνο κανόνας WAF με αυτό το ελάττωμα έριξε το δίκτυο της Cloudflare για περίπου μισή ώρα στις 2 Ιουλίου 2019. Επειδή αυτός ο έλεγχος τρέχει στην καρτέλα σας, ένα τέτοιο μοτίβο μπορεί να παγώσει τη σελίδα· ανανεώστε και ξαναγράψτε το ώστε δύο ποσοδείκτες να μην διεκδικούν τους ίδιους χαρακτήρες, χρησιμοποιώντας πιο στενές κλάσεις όπως το [^,]* αντί για .*, ή άγκυρες. Για επεξεργασία του ίδιου του κειμένου και όχι αντιστοίχιση, δείτε τα εργαλεία κειμένου· περισσότερα εργαλεία για προγραμματιστές θα βρείτε στο κέντρο εργαλείων για προγραμματιστές.
Συχνές ερωτήσεις
- Γιατί η κανονική έκφραση βρίσκει μόνο ένα αποτέλεσμα;
- Το flag g είναι απενεργοποιημένο. Χωρίς αυτό, η μηχανή σταματά μετά την πρώτη αντιστοίχιση. Ενεργοποιήστε το g για να εμφανιστούν όλες οι εμφανίσεις· το flag y μόνο του βρίσκει επίσης πολλές, αλλά μόνο όταν ακολουθούν η μία την άλλη αμέσως.
- Ταιριάζει το \d με ψηφία άλλων συστημάτων γραφής στη JavaScript;
- Όχι. Στην JavaScript το \d σημαίνει μόνο 0 έως 9 και το \w μόνο γράμματα ASCII, ψηφία και κάτω παύλα, ακόμη και με το flag u. Χρησιμοποιήστε \p{Nd} ή \p{L} με το u για άλλα αλφάβητα.
- Θα συμπεριφέρεται ένα μοτίβο που δοκιμάστηκε εδώ το ίδιο σε Python ή PHP;
- Η βασική σύνταξη μεταφέρεται, αλλά οι λεπτομέρειες διαφέρουν: οι ονομασμένες ομάδες της Python γράφονται
(?P<name>…), η PHP και η Python υποστηρίζουν possessive ποσοδείκτες που λείπουν από την JavaScript, και οι κανόνες του lookbehind διαφέρουν. Ελέγξτε ξανά στη μηχανή-στόχο. - Πώς ταιριάζω μια κυριολεκτική τελεία ή αγκύλη;
- Βάλτε μπροστά μια ανάστροφη κάθετο: το
\.αντιστοιχεί σε τελεία και το\[σε αριστερή αγκύλη. Μέσα σε κλάση χαρακτήρων τα περισσότερα σύμβολα είναι ήδη κυριολεκτικά, οπότε και το[.]αντιστοιχεί μόνο σε τελεία. - Γιατί πάγωσε η σελίδα ενώ πληκτρολογούσα ένα μοτίβο;
- Το μοτίβο πιθανότατα προκάλεσε catastrophic backtracking στο κείμενό σας. Ανανεώστε τη σελίδα και αποφύγετε ένθετους ποσοδείκτες όπως
(.*)*ή(a+)+, και κάντε κάθε τμήμα να αντιστοιχεί όσο το δυνατόν λιγότερο.