Δοκιμή κανονικής έκφρασης
- Πίνακας ελέγχου
- Τεκμηρίωση
- API
Σε τι χρησιμοποιείται ένας ελεγκτής κανονικής έκφρασης;
Ένας ελεγκτής regex σάς επιτρέπει να ελέγξετε ότι ταιριάζει ένα μοτίβο τυπικής έκφρασης (regex).
στο αναμενόμενο κείμενο, χωρίς να χρειάζεται να εκκινήσετε τον κωδικό της εφαρμογής. Επικολλάμε το μοτίβο, επικολλάμε το κείμενο εισαγωγής, εμείς
ελέγξτε τις επιλογές (σημαίες) και το εργαλείο εμφανίζει αμέσως τη λίστα των αντιστοιχιών που βρέθηκαν
καθώς και τις αιχμαλωτισμένες ομάδες. Αυτό είναι το διαδικτυακό ισοδύναμο του preg_match_all() στην PHP, από
String.matchAll() σε JavaScript ή re.findall() σε Python.
Τα Regexes είναι και ισχυρά και δύσκολα. Ένα κόμμα, μια άστοχη παρένθεση, ένας ποσοτικός δείκτης λαίμαργος που ρουφάει πάρα πολλούς χαρακτήρες: και η χορδή που εξάγεται δεν είναι πλέον αυτό που περιμέναμε. Ο δοκιμαστής αποφεύγει το ταξίδι μετ' επιστροφής με έναν επεξεργαστή, ένα τερματικό και ένα αρχείο δοκιμής: επαναλαμβάνουμε το μοτίβο μέχρι να δούμε το καλό αποτέλεσμα.
Πώς να γράψετε το μοτίβο;
Εισαγάγετε το regex χωρίς οριοθέτες. Όχι /.../, όχι #...#.
Για παράδειγμα, για να καταγράψετε διευθύνσεις email από κείμενο, απλώς πληκτρολογήστε
[\w.+-]+@[\w-]+\.[\w.-]+. Οι επιλογές (σημαίες) ελέγχονται από πλαίσια ελέγχου.
Η επιλογή u (Unicode) είναι επιλεγμένη από προεπιλογή. Είναι σχεδόν πάντα επιθυμητό: χωρίς αυτό,
Το \w δεν αναγνωρίζει τόνους και ορισμένα μοτίβα επιστρέφουν ένα σιωπηλό σφάλμα PCRE
Χορδές UTF-8.
Επιλογές PCRE
- i (χωρίς διάκριση πεζών-κεφαλαίων):
[a-z]αναγνωρίζει επίσης κεφαλαία γράμματα. - m (πολλαπλή γραμμή):
^και$ταιριάζουν με την αρχή και το τέλος του κάθε γραμμή, συν μόνο την αρχή και το τέλος της συνολικής συμβολοσειράς. - s (doll):
.αναγνωρίζει επίσης αλλαγές γραμμής. Χρήσιμο για μοτίβα που πρέπει να διασταυρώνονται παραγράφοι. - u (unicode): ερμηνεύει το μοτίβο και το θέμα στο UTF-8. Απαραίτητο μόλις το κείμενο περιέχει χαρακτήρες που δεν είναι ASCII (τονισμοί, emoji, ιδεογράμματα).
Κοινά Παραδείγματα Regex
- Διεύθυνση ηλεκτρονικού ταχυδρομείου:
[\w.+-]+@[\w-]+\.[\w.-]+(απλοποιημένη μορφή, επαρκής για πιο πρακτικές περιπτώσεις? Το αυστηρό RFC 5322 είναι πολύ περίπλοκο). - URL HTTP/HTTPS:
https?://[\w.-]+(?:/[\w./?%&=-]*)? - Γαλλικός αριθμός τηλεφώνου:
(?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4} - Γαλλικός ταχυδρομικός κώδικας:
\d{5} - Ημερομηνία ISO (ΕΕΕΕ-ΜΜ-ΗΗ):
\d{4}-\d{2}-\d{2} - Διεύθυνση IPv4:
(?:\d{1,3}\.){3}\d{1,3} - Ολόκληρη λέξη:
foo(τα όρια λέξης αποφεύγουν την αντιστοίχισηποδόσφαιρο). - Hashtag:
#\w+ - Αριθμός σημασιολογικής έκδοσης:
\d+\.\d+\.\d+(?:-[\w.-]+)? - Twitter ID / X:
@\w{1,15}
Αιχμαλωτισμένες ομάδες
Ένα regex μπορεί να περιέχει ομάδες σε παρένθεση, οι οποίες απομονώνουν ένα τμήμα του αγώνα για επαναχρησιμοποίηση.
Για παράδειγμα, το μοτίβο (\w+)@(\w+\.\w+) που εφαρμόζεται στο alice@example.com καταγράφει δύο
ομάδες: alice και example.com. Το εργαλείο εμφανίζει αυτές τις ομάδες σε μια στήλη
αφιερωμένο, δίπλα σε κάθε αγώνα. Οι ομάδες με όνομα ((?P) είναι επίσης
παρατίθενται, ευρετηριάζονται με το όνομα.
Για ομαδοποίηση χωρίς σύλληψη (χρήσιμο για την εφαρμογή ενός ποσοτικού δείκτη χωρίς ρύπανση της λίστας των ομάδων),
χρησιμοποιεί το (?:...).
Προστασία από ReDoS
Ο κινητήρας PCRE της PHP μπορεί να εισέλθει σε καταστροφικό backtracking για ορισμένους παθολογικούς λόγους:
ένα μοτίβο όπως το (a+)+$ που εφαρμόζεται σε μια μακροχρόνια, μη τερματισμένη συμβολοσειρά a μπορεί να αποκλείσει
ο διακομιστής για αρκετά δευτερόλεπτα. Για να αποφύγετε αυτήν την τακτική έκφραση άρνηση παροχής υπηρεσιών
(ReDoS), το εργαλείο εφαρμόζει δύο όρια:
- ένα
set_time_limit(2)στην πλευρά του εργαζόμενου (η επεξεργασία διακόπτεται μετά από 2 δευτερόλεπτα); - μείωση του
pcre.backtrack_limitσε 100.000, με αποτέλεσμα τα μοτίβα να αποτυγχάνουν γρήγορα που εξερευνούν πάρα πολλούς συνδυασμούς.
Σε περίπτωση πολύ ακριβού λόγου, το εργαλείο εμφανίζει το μήνυμα σφάλματος PCRE
(preg_last_error_msg()), συνήθως Το όριο του Backtrack εξαντλήθηκε. Αναδιατυπώστε το δικό σας
μοτίβο χρησιμοποιώντας κτητικούς ποσοτικούς δείκτες (a++) ή ατομικές ομάδες
((?>...)) για αποφυγή οπισθοδρόμησης.
Συχνές ερωτήσεις
Γιατί το regex μου δεν ταιριάζει ακόμα κι αν λειτουργεί σε JavaScript;
Ο κινητήρας αυτού του εργαλείου είναι το PCRE (PHP), κοντά στο Perl. Η σύνταξη είναι πολύ παρόμοια με την JavaScript αλλά ορισμένα χαρακτηριστικά διαφέρουν: lookbehind μεταβλητού μήκους, ορισμένα ψευδώνυμα Unicode ή ο προεπιλεγμένος χειρισμός της ευαισθησίας πεζών-κεφαλαίων. Εάν σκοπεύετε να εκτελέσετε την πλευρά του μοτίβου πρόγραμμα περιήγησης, δοκιμή και σε περιβάλλον JS.
Γιατί το \w μου δεν καταγράφει τόνους;
Χωρίς τη σημαία u, το \w αναγνωρίζει μόνο το [A-Za-z0-9_]. Με
u (Unicode), αναγνωρίζει όλα τα γράμματα με την έννοια UCD, συμπεριλαμβανομένων των τονισμένων χαρακτήρων.
Για να προχωρήσετε περαιτέρω, χρησιμοποιήστε τάξεις Unicode: \p{L} (γράμμα), \p{N}
(αριθμός), \p{P} (σημεία στίξης).
Διατηρεί το εργαλείο το κείμενό μου;
Όχι. Το μοτίβο και το θέμα επεξεργάζονται στη μνήμη RAM από τον εργαζόμενο της PHP, χωρίς επιμονή. Δεν υπάρχουν δεδομένα που υποβλήθηκε δεν έχει καταγραφεί.
Τι πρέπει να κάνω εάν λάβω ένα μήνυμα "Το όριο του Backtrack εξαντλήθηκε";
Το μοτίβο σας πηγαίνει πέρα δώθε πάρα πολύ. Αναζητήστε ένθετους ποσοτικούς δείκτες του τύπου
(a+)+ ή (\w+)*, που είναι τυπικές περιπτώσεις ReDoS. Αντικαταστήστε τα με ένα
μονοσήμαντη μορφή: για παράδειγμα \w+ αντί για (\w+)*.
Μπορώ να δοκιμάσω ένα μοτίβο πολλαπλών γραμμών;
Ναι. Επιλέξτε την επιλογή m ώστε τα ^ και $ να αναγνωρίσουν τις αρχές
και τα άκρα κάθε γραμμής. Ελέγξτε επιπλέον το s εάν θέλετε το . να διασχίσει το
σπασίματα γραμμής.
Παράδειγμα αιτήματος
curl -X POST https://cdrn.fr/api/v1/tools/regex-tester/execute \
-H "Content-Type: application/json" \
-d '{"pattern":"...","subject":"...","flag_i":false,"flag_m":false,"flag_s":false,"flag_u":true}'
Σχήμα εισόδου
| Πεδίο | Τύπος | Απαιτείται | Προεπιλογή |
|---|---|---|---|
pattern |
string | ✓ | – |
subject |
text | ✓ | – |
flag_i |
boolean | ✓ | false |
flag_m |
boolean | ✓ | false |
flag_s |
boolean | ✓ | false |
flag_u |
boolean | ✓ | true |
Σημεία πρόσβασης
GET https://cdrn.fr/api/v1/tools- εμφανίζει όλα τα διαθέσιμα εργαλείαGET https://cdrn.fr/api/v1/tools/regex-tester- ανακτά το σχήμα αυτού του εργαλείουPOST https://cdrn.fr/api/v1/tools/regex-tester/execute- εκτελεί αυτό το εργαλείο με payload JSON