Πώς να χρησιμοποιήσετε: Regex Tester
- Γράψτε το μοτίβο σας ανάμεσα στις καθέτους, χωρίς τα περιβάλλοντα
/. - Ενεργοποιήστε σημαίες όπως
g (όλες οι αντιστοιχίες), i (χωρίς διάκριση πεζών-κεφαλαίων) και m (πολλές γραμμές). - Επικολλήστε το κείμενο δοκιμής. Οι αντιστοιχίες επισημαίνονται δεξιά και εμφανίζονται από κάτω με τη θέση και τις ομάδες σύλληψής τους.
- Τσεκάρετε Αντικατάσταση και γράψτε μια αντικατάσταση όπως
$1 ή $<name> για προεπισκόπηση του String.replace. - Διαλέξτε ένα μοτίβο από τη Βιβλιοθήκη μοτίβων για να ξεκινήσετε από δοκιμασμένο regex για email, URL, IP ή ημερομηνία.
Κανονικές εκφράσεις JavaScript
Ο tester χρησιμοποιεί τη μηχανή RegExp του ίδιου του browser σας, οπότε τα αποτελέσματα είναι ακριβώς αυτά που επιστρέφουν τα String.match, matchAll, replace και RegExp.exec σε JavaScript και Node.js. Αυτό περιλαμβάνει σύγχρονη σύνταξη: ονομασμένες ομάδες (?<name>…), lookbehind (?<=…), Unicode property escapes όπως \p{L} με τη σημαία u και δείκτες αντιστοιχιών με τη σημαία d.
Τι κάνουν οι σημαίες
| Σημαία | Όνομα | Αποτέλεσμα |
g | global | Βρίσκει κάθε αντιστοιχία αντί να σταματά στην πρώτη. |
i | ignoreCase | Τα γράμματα ταιριάζουν ανεξάρτητα από πεζά-κεφαλαία. |
m | multiline | Τα ^ και $ ταιριάζουν στην αρχή και στο τέλος κάθε γραμμής. |
s | dotAll | Η . ταιριάζει και σε αλλαγές γραμμής. |
u | unicode | Χειρίζεται το μοτίβο ως code points· ενεργοποιεί τα \p{…} και \u{…}. |
y | sticky | Ταιριάζει μόνο στην τρέχουσα θέση lastIndex. |
d | hasIndices | Αναφέρει θέσεις αρχής και τέλους για κάθε ομάδα σύλληψης. |
Προστασία από catastrophic backtracking
Μοτίβα με εμφωλευμένους ποσοδείκτες, όπως (a+)+$ ή (\w|\d)*x, μπορεί να χρειαστούν εκθετικό χρόνο σε εισόδους που σχεδόν ταιριάζουν. Σε μια κανονική ιστοσελίδα αυτό παγώνει την καρτέλα. Εδώ κάθε αντιστοίχιση τρέχει σε έναν Web Worker στο παρασκήνιο που σταματά μετά από ένα δευτερόλεπτο, και παίρνετε μια σαφή προειδοποίηση αντί για κολλημένο browser. Το ίδιο μοτίβο σε κώδικα παραγωγής μπορεί να είναι ευπάθεια ReDoS, οπότε αντιμετωπίστε την προειδοποίηση ως bug που πρέπει να διορθωθεί.
Συμβουλές για καλύτερα regex
- Αγκυρώστε τα μοτίβα με
^ και $ όταν επικυρώνετε ολόκληρες τιμές, αλλιώς περνά μια αντιστοιχία οπουδήποτε μέσα στο string.
- Προτιμήστε συγκεκριμένες κλάσεις όπως
[^"]* αντί για .*· είναι ταχύτερες και αποφεύγουν τις υπερβολικές αντιστοιχίες.
- Χρησιμοποιήστε ομάδες χωρίς σύλληψη
(?:…) όταν δεν χρειάζεστε την τιμή που συλλαμβάνεται.
- Δώστε ονόματα στις ομάδες σας. Το
match.groups.year διαβάζεται πιο εύκολα από το match[1].
Συχνές ερωτήσεις
Ποια παραλλαγή regex χρησιμοποιεί ο tester;
JavaScript (ECMAScript), μέσω του ενσωματωμένου RegExp του browser σας. Το μεγαλύτερο μέρος της σύνταξης είναι κοινό με PCRE, Python και Java, αλλά χαρακτηριστικά όπως possessive quantifiers, atomic groups και inline modifiers όπως (?i) δεν υπάρχουν στη JavaScript.
Γιατί το μοτίβο μου βρίσκει μόνο μία αντιστοιχία;
Χωρίς τη σημαία g (global), η JavaScript σταματά μετά την πρώτη αντιστοιχία. Ενεργοποιήστε το g για να βρείτε κάθε εμφάνιση.
Πώς αναφέρομαι σε ομάδες στην αντικατάσταση;
Χρησιμοποιήστε $1, $2… για αριθμημένες ομάδες, $<name> για ονομασμένες ομάδες, $& για ολόκληρη την αντιστοιχία και $$ για ένα κυριολεκτικό σύμβολο δολαρίου.
Γιατί ο tester σταμάτησε με timeout;
Το μοτίβο χρειάστηκε πάνω από ένα δευτερόλεπτο για την είσοδό σας, κάτι που σχεδόν πάντα σημαίνει catastrophic backtracking. Ψάξτε για εμφωλευμένους ποσοδείκτες όπως (x+)+ ή επικαλυπτόμενες εναλλακτικές όπως (a|a)* και ξαναγράψτε τα ώστε κάθε χαρακτήρας να μπορεί να ταιριάξει μόνο με έναν τρόπο.
Αποστέλλονται κάπου τα δεδομένα δοκιμής μου;
Όχι. Η αντιστοίχιση τρέχει τοπικά σε έναν Web Worker μέσα στον browser σας. Το μοτίβο και το κείμενό σας αποθηκεύονται μόνο στον δικό σας browser, ώστε να είναι ακόμη εκεί όταν επιστρέψετε.