Regex και ιδιότητες#

Μόλις οι συμβολοσειρές σας αποκωδικοποιηθούν, η regex λειτουργεί σε χαρακτήρες - και η μηχανή regex της Perl γνωρίζει για το Unicode. Το \w ταιριάζει κάθε χαρακτήρα λέξης Unicode, η αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων αναδιπλώνεται μεταξύ γραφών, και το \p{…} σας δίνει πρόσβαση στην πλήρη βάση δεδομένων χαρακτήρων Unicode. Αυτό το κεφάλαιο καλύπτει τις συνήθειες που χρειάζεστε για να το κάνετε να δουλεύει αξιόπιστα.

Χαρακτήρες, όχι bytes#

Σε μια συμβολοσειρά κειμένου, κάθε μετα-χαρακτήρας regex μιλά σε χαρακτήρες:

use utf8;
my $s = "café";                          # 4 characters
$s =~ /^.{4}$/;                          # matches
$s =~ /^.{5}$/;                          # does not

Σε μια binary συμβολοσειρά, οι ίδιοι μετα-χαρακτήρες μετρούν bytes. Αυτό συνήθως δεν είναι αυτό που θέλετε - αν βρεθείτε να γράφετε μια regex έναντι bytes που περιέχουν κείμενο, αποκωδικοποιήστε πρώτα.

Τα \w, \d, \s και οι φίλοι τους#

Στην προεπιλεγμένη (Unicode) λειτουργία, αυτές οι συντομογραφίες ταιριάζουν τα ισοδύναμά τους στο Unicode:

  • \w - γράμματα, ψηφία και κάτω παύλα από κάθε γραφή.

  • \d - δεκαδικά ψηφία από κάθε γραφή (όχι μόνο 09).

  • \s - λευκός χαρακτήρας κάθε είδους, συμπεριλαμβανομένου του U+00A0 no-break space.

use utf8;
"café"  =~ /^\w+$/;                      # matches
"café"  =~ /^[a-z]+$/;                   # does not - é is outside
"\x{0660}\x{0661}\x{0662}" =~ /^\d+$/;   # matches Arabic-Indic digits

Όταν θέλετε την παλιά σημασία μόνο-ASCII, προσθέστε τον τροποποιητή /a - δείτε τους Τροποποιητές παρακάτω.

Οι κλάσεις ιδιοτήτων \p{…}#

Το \p{PROPERTY} ταιριάζει οποιονδήποτε χαρακτήρα με μια ονομασμένη ιδιότητα Unicode. Τα ονόματα ιδιοτήτων αντλούνται από τη βάση δεδομένων χαρακτήρων Unicode· τα συνήθως χρήσιμα είναι:

  • \p{Letter}, συντομογραφία \p{L} - οποιοδήποτε γράμμα.

  • \p{Lu}, \p{Ll}, \p{Lt} - κεφαλαία, πεζά, title-case γράμματα.

  • \p{Number}, \p{N}, \p{Nd} - όλοι οι αριθμοί, δεκαδικά ψηφία.

  • \p{Punct}, \p{P} - σημεία στίξης.

  • \p{Space}, \p{Zs} - λευκός χαρακτήρας, διαχωριστές διαστήματος.

  • \p{ASCII} - τα 128 σημεία κώδικα ASCII.

  • \p{Script=Greek} - κάθε χαρακτήρας που ανήκει στην ελληνική γραφή. Οποιοδήποτε όνομα γραφής από τα δεδομένα Unicode λειτουργεί εδώ.

  • \p{Block=Cyrillic} - κάθε χαρακτήρας στο κυριλλικό block. (Η γραφή και το block διαφέρουν: η γραφή είναι το σύστημα γραφής στο οποίο ανήκει ένας χαρακτήρας· το block είναι το εύρος σημείων κώδικα στο οποίο βρίσκεται.)

Το \P{…} είναι η άρνηση - οποιοσδήποτε χαρακτήρας χωρίς αυτή την ιδιότητα.

use utf8;
my $s = "Γειά σου, κόσμε";
my @greek_letters = $s =~ /(\p{Script=Greek})/g;
scalar @greek_letters;                   # 12

Ο πλήρης κατάλογος ιδιοτήτων συνοδεύει την Perl· το perldoc perluniprops απαριθμεί κάθε όνομα που αποδέχεται η μηχανή.

Τροποποιητές: /a, /u, /l, /aa#

Τέσσερις τροποποιητές αλλάζουν το πώς ερμηνεύονται οι κλάσεις χαρακτήρων:

  • /u - Unicode mode. Το \w ταιριάζει χαρακτήρες λέξης Unicode, το \d ταιριάζει δεκαδικά ψηφία Unicode, η αναδίπλωση πεζών-κεφαλαίων χρησιμοποιεί κανόνες Unicode. Αυτή είναι η προεπιλογή σε συμβολοσειρές κειμένου.

  • /a - ASCII mode. \w becomes [A-Za-z0-9_], \d becomes [0-9], \s becomes [ \t\n\r\f]. Case folding is still Unicode - /foo/ai still matches FÖO through Ö if you wrote foo - which is almost never what you want when you reached for /a.

  • /aa - strict ASCII. Το /a συν η αναδίπλωση πεζών-κεφαλαίων περιορίζεται σε ASCII. Το /foo/aai ταιριάζει FOO αλλά όχι FÖO. Χρησιμοποιήστε το όταν θέλετε αντιστοίχιση αναγνωριστικού έναντι μιας γνωστά-ASCII προδιαγραφής (ονόματα κεφαλίδων HTTP, λέξεις-κλειδιά εντολών).

  • /l - locale mode. Παραπέμπει στο τρέχον locale POSIX. Σχεδόν ποτέ αυτό που θέλετε σε ένα πρόγραμμα με επίγνωση Unicode· αναφέρεται μόνο για να μπορείτε να το αναγνωρίσετε όταν το χρησιμοποιεί μια άλλη βάση κώδικα.

use utf8;
"café" =~ /\w+/;                         # matches whole word (Unicode)
"café" =~ /\w+/a;                        # matches "caf" (ASCII only)
"FOO"  =~ /foo/ai;                       # matches (case fold anywhere)
"FÖO"  =~ /foo/aa;                       # does not - strict ASCII

Εμπειρικός κανόνας: η προεπιλεγμένη λειτουργία είναι σωστή για κείμενο· περάστε στο /aa όταν αναλύετε ένα πρωτόκολλο καθορισμένο σε ASCII και θέλετε να απορρίψετε λαθραίους μη-ASCII χαρακτήρες.

Αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων#

Το /i αναδιπλώνει και τις δύο πλευρές της αντιστοιχίας χρησιμοποιώντας τους πίνακες αναδίπλωσης πεζών-κεφαλαίων Unicode. Αυτό χειρίζεται τα προφανή ευρωπαϊκά ζεύγη (é/É, ß/SS), και τα λιγότερο προφανή (İ/, /fi).

use utf8;
"Ångström" =~ /ångström/i;               # matches
"STRASSE"  =~ /straße/i;                 # matches - ß folds to SS

Για αναδίπλωση πεζών-κεφαλαίων σε επίπεδο κυριολεκτικών byte (την παλιά σημασία ASCII του /i), χρησιμοποιήστε /iaa.

Ονομασμένα σημεία κώδικα#

Το \N{...} ονομάζει έναν χαρακτήρα Unicode, είτε με το επίσημο όνομά του είτε με τον αριθμό του σημείου κώδικα:

use charnames ();
"\N{LATIN SMALL LETTER E WITH ACUTE}" eq "\x{e9}";   # true
"\N{U+00E9}" eq "\x{e9}";                             # the same character

Το \N{U+HEX} λειτουργεί χωρίς καμία pragma· τα μακρά ονόματα περνούν μέσα από το άρθρωμα charnames, που φορτώνεται αυτόματα μέσα σε ένα escape \N{...} (ή ρητά με use charnames qw(:full)). Σε ένα μοτίβο, το \N{...} είναι χρήσιμο όταν θέλετε ο πηγαίος κώδικας να τεκμηριώνει ποιον χαρακτήρα εννοείτε χωρίς να βασίζεστε στο ότι ο αναγνώστης θα αναγνωρίσει ένα δεκαεξαδικό escape:

"café" =~ /caf\N{LATIN SMALL LETTER E WITH ACUTE}/;  # matches

Διαχωρισμός και ένωση#

Οι split και substr μετρούν και οι δύο στις μονάδες της συμβολοσειράς στην οποία λειτουργούν. Σε μια συμβολοσειρά κειμένου, η μέτρηση είναι χαρακτήρες:

use utf8;
my $s = "a,é,b,Ω";
my @parts = split /,/, $s;               # ("a", "é", "b", "Ω")
substr($s, 2, 1);                        # "é"

Σε μια binary συμβολοσειρά, οι ίδιες λειτουργίες μετρούν bytes. Αυτό είναι το πιο συνηθισμένο λεπτό σφάλμα - μια παλιά βάση κώδικα που αποκωδικοποίησε την είσοδο σε μία συνάρτηση αλλά δεικτοδότησε το αποτέλεσμα σε μια άλλη, φτιαγμένη πριν εισαχθεί το βήμα αποκωδικοποίησης.