Κανονικές εκφράσεις#
Μια κανονική έκφραση (regexp, regex) είναι ένα μοτίβο που αποφασίζει αν μια συμβολοσειρά έχει ένα δεδομένο σχήμα, ή που εξάγει τμήματα από μια συμβολοσειρά που το έχει. Η Perl αντιμετωπίζει τις regex ως υπογλώσσα πρώτης τάξης: εμφανίζονται οπουδήποτε γίνεται αντιστοίχιση (m//), αντικατάσταση (s///), παράθεση μοτίβου (qr//), ή διαχωρισμός με βάση διαχωριστή (split).
Αυτός ο οδηγός είναι η οριστική αναφορά της pperl για τις regex. Κάθε κεφάλαιο καλύπτει ένα θέμα σε τρία επίπεδα: μια επισκόπηση που σας προσανατολίζει, μια ακριβή αναφορά που ορίζει τι κάνει η κατασκευή, και τις λεπτομέρειες — οριακές περιπτώσεις, παθολογίες απόδοσης, και τις διαφορές μεταξύ μηχανών που εκπλήσσουν έναν αναγνώστη εκπαιδευμένο στην Perl. Το ίδιο κεφάλαιο εξυπηρετεί τον αναγνώστη που χρειάζεται μια απάντηση μιας παραγράφου και τον αναγνώστη που θέλει να ξέρει ακριβώς πότε ένα μοτίβο θα συμπεριφερθεί παράξενα.
Σε ποιους απευθύνεται#
Σε αναγνώστες που γνωρίζουν Perl αρκετά καλά ώστε να χρησιμοποιούν βαθμωτά, πίνακες και κατακερματισμούς, αλλά αντιμετωπίζουν τις regex ως κάτι που αντιγράφουν από αλλού ελπίζοντας να δουλέψει. Μετά την ανάγνωση, θα διαβάζετε ένα άγνωστο μοτίβο και θα ξέρετε με τι θα ταιριάξει — και πότε θα αρνηθεί, και γιατί.
Πώς είναι οργανωμένος ο οδηγός#
Τα κεφάλαια προορίζονται να διαβαστούν με σειρά σε μια πρώτη ανάγνωση, αλλά καθένα στέκεται από μόνο του ως μεταγενέστερη αναφορά.
Βασικά —
m//,s///, οι τελεστές σύνδεσης=~και!~, τι θεωρείται μετα-χαρακτήρας, πώς να διαφεύγετε χαρακτήρες, το μοντέλο ανάλυσης τεσσάρων φάσεων.Κλάσεις χαρακτήρων — κλάσεις σε αγκύλες
[…], αρνημένες κλάσεις, συντομογραφίες\d\w\s, κλάσεις POSIX, η εκτεταμένη μορφή σε αγκύλες(?[…]), το επεξεργασμένο παράδειγμα διεύθυνσης IP.Άγκυρες και διεκδικήσεις —
^,$,\b,\A,\z,\G,\K, πρόσθια διεκδίκηση, οπίσθια διεκδίκηση, τα όρια Unicode\b{…}, η παράθεση ως AND.Ποσοδείκτες —
*,+,?,{n,m}, άπληστοι έναντι μη άπληστων έναντι κτητικών, οι αρχές της αντιστοίχισης.Ομάδες και συλλήψεις —
(...),(?:...), ονομαστικές συλλήψεις, οπισθαναφορές, ατομικές ομάδες, αναδρομικά υπομοτίβα, υπό συνθήκη μοτίβα, επαναφορά διακλάδωσης.Εναλλαγή —
|, προτεραιότητα, παραγοντοποίηση κοινού προθέματος, κενές εναλλακτικές, επαναφορά διακλάδωσης.Τροποποιητές —
/i,/m,/s,/x,/xx,/g,/c,/r,/e,/n,/p,/o,/a,/aa,/u,/l,/d, ενσωματωμένες μορφές(?i…), μορφές με εμβέλεια(?i:…), το μοντέλο ανάλυσης τεσσάρων φάσεων,use re 'strict'.Αντικατάσταση —
s///σε βάθος: η συμβολοσειρά αντικατάστασης,/e,/ee,/r,\Kστην αντικατάσταση, τερματισμός αντιστοιχίας μηδενικού μήκους.Unicode —
\p{…},\P{…},\X, γραφές, οι τροποποιητές συνόλου χαρακτήρων, πτύχωση πεζών-κεφαλαίων, δρομείς γραφής, κωδικοποίηση έναντι χαρακτήρα.Απόδοση — οπισθοχώρηση, καταστροφικά μοτίβα, ξετύλιγμα του βρόχου, ατομικές ομάδες, κτητικοί ποσοδείκτες, αναδρομικά μοτίβα, ενσωματωμένος κώδικας, ειδικά ρήματα ελέγχου οπισθοχώρησης, εσωτερικές βελτιστοποιήσεις που εφαρμόζει η μηχανή για λογαριασμό σας.
Μεταξύ μηχανών — σύγκριση με PCRE2, Emacs, POSIX BRE, POSIX ERE, και RE2 / Go.
Μια πρώτη ολοκληρωμένη διαδρομή#
Το συντομότερο χρήσιμο πρόγραμμα regex — εύρεση τρίγραμμων λέξεων που επαναλαμβάνονται διαδοχικά, χωρισμένες με ένα διάστημα:
my $text = "I said the the other day";
if ($text =~ /\b(\w{3})\s\1\b/) {
print "Repeated: $1\n"; # Repeated: the
}
Το
\bείναι όριο λέξης — το μοτίβο ενεργοποιείται μόνο στις άκρες λέξεων.Το
(\w{3})συλλαμβάνει ακριβώς τρεις χαρακτήρες λέξης στο$1.Το
\sείναι ένας λευκός χαρακτήρας ανάμεσα στα δύο αντίγραφα.Το
\1είναι η οπισθαναφορά: ταίριαξε ξανά τους ίδιους τρεις χαρακτήρες.
Κάθε πιο σύνθετο μοτίβο στον οδηγό χτίζεται πάνω σε αυτή την ιδέα — αγκυρώστε όπου χρειάζεται, περιγράψτε αυτό που θέλετε, συλλάβετε αυτό που θέλετε να ανακτήσετε.
Συμβάσεις στα παραδείγματα#
Η έξοδος των παραδειγμάτων εμφανίζεται ως ενσωματωμένο σχόλιο
# …δίπλα στην έκφραση που την παράγει.Τα παραδείγματα προϋποθέτουν τους προεπιλεγμένους τροποποιητές, εκτός αν εμφανίζουν
/i,/x, κτλ.Όπου ένα μοτίβο εμφανίζεται μόνο του (χωρίς
=~), θεωρήστε το ως τμήμα που το περιβάλλον κείμενο θα συνδυάσει με μια συμβολοσειρά.Όταν χρειάζεται ένας χαρακτήρας Unicode, τα παραδείγματα χρησιμοποιούν
\x{263a}ή\N{GREEK SMALL LETTER SIGMA}ώστε το αποδιδόμενο κείμενο να ταιριάζει με την πηγή.