Pages

Tuesday, August 17, 2010

Regular Expressions: Finally an explanation...

Στο προηγούμενο ποστ για το Live Search, κάνω χρήση των regular expressions (θα το λέω έτσι, ή RegExps, ή κάτι τέτοιο, και όχι το ηλίθιο ελληνικό "κανονικές εκφράσεις").

Γνωρίζοντας και από τη σχολή μου τι φόβος υπάρχει γύρω από αυτό το θέμα θα προσπαθήσω να τα εξηγήσω όσο πιο απλά μπορώ. Να προειδοποιήσω ότι πρέπει να είστε προετοιμασμένοι να εκνευριστείτε απίστευτα στις προσπάθειές σας, και να φάτε πολλή ώρα ψάχνοντας να βρείτε την τελεία που νομίζετε ότι είχατε πατήσει, αλλά τελικά δεν πατήθηκε και δεν λειτουργεί η RegExp σας όπως θα περιμένατε.

Πήρατε κουράγιο;
Ωραία..

Πριν ξεκινήσω να εξηγώ, συνιστώ να κατεβάσετε αυτό εδώ το προγραμματάκι, το οποίο για όσους βαριούνται τη διαδικασία υπάρχει και η online έκδοσή του εδώ. Με αυτό το πρόγραμμα θα μπορείτε να βλέπετε αμέσως τα αποτελέσματα αυτών που γράφετε.

Ας ξεκινήσω με ένα παράδειγμα, αρκετά κλασσικό που χρησιμοποιείται σε πολλά site και όχι μόνο.
Την επαλήθευση ότι αυτό που έγραψε ο χρήστης στο πεδίο του e-mail είναι όντως μια διεύθυνση e-mail και όχι ότι κατέβηκε εκείνη την ώρα στη γκλάβα του:


^[a-zA-Z0-9][a-zA-Z0-9\._]+@[a-zA-Z0-9\._]+\.[a-zA-Z]{2,4}$

Μη τρομάζετε, θα το πάρουμε βήμα-βήμα:
Το ^ σημαίνει την αρχή του string.
To [a-zA-Z0-9] σημαίνει όλα τα πεζά λατινικά γράμματα από a-z, όλα τα κεφαλαία λατινικά από Α-Ζ και όλους τους αριθμούς από 0-9.
Με αυτά τα 2 ζητάμε ουσιαστικά το οποιοδήποτε e-mail να ξεκινάει με χαρακτήρα ή αριθμό.

Η επόμενη αγκύλη [a-zA-Z0-9\._] σημαίνει ακριβώς ότι το προηγούμενο και επιπλέον: την τελεία (\.) και το underscore (_). Ο λόγος που υπάρχει κάθετος πριν την τελεία είναι για να πάρει την τελεία ως χαρακτήρα και όχι με την ιδιότητα που έχει στις RegExps.

Μέχρι στιγμής ζητάμε δηλαδή να ξεκινάει από κεφαλαίο ή μικρό λατινικό γράμμα ή αριθμό και ο επόμενος χαρακτήρας να είναι κεφαλαίο ή μικρό λατινικό γράμμα, ή αριθμός, ή τελεία, ή underscore.

To + που ακολουθεί αμέσως μετά, σημαίνει ότι θέλουμε η προηγούμενη έκφραση (δηλαδή η προηγούμενη αγκύλη) να υπάρχει 1 ή περισσότερες φορές

Το @ δεν έχει κάποια ειδική σημασία, είναι το κλασσικό @ που υπάρχει σε όλα τα e-mails.

H επόμενη αγκύλη μαζί με το + και το \. που ακολουθούν σημαίνουν ακριβώς τα ίδια όπως και παραπάνω, οπότε δεν τα ξαναγράφω.

Τέλος φτάνουμε στο [a-zA-Z]{2-4}
Εδώ είμαστε ουσιαστικά στην κατάληξη του e-mail. Η αγκύλη όπως και παραπάνω, σημαίνει έναν χαρακτήρα από το λατινικό αλφάβητο, κεφαλαίο ή μικρό. Το {2-4} σημαίνει πως ζητάμε η προηγούμενη έκφραση να υπάρχει από 2 μέχρι 4 φορές, δηλαδή η κατάληξη του e-mail να είναι 2 ως 4 λατινικοί χαρακτήρες είτε κεφαλαίοι είτε πεζοί.

Το $ στο τέλος δηλώνει το τέλος του string.
Βλέπει κανείς λοιπόν, ότι ενώ αν το δεις όλο με τη μία τρως μια φρίκη, αν το πάρεις σιγά σιγά, καταλαβαίνεις τι παίζει αρκετά εύκολα.

Πριν κλείσω να προσθέσω μερικούς ακόμα βασικούς ειδικούς χαρακτήρες που είναι ιδιαίτερα χρήσιμοι:
. (τελεία): Σημαίνει οποιονδήποτε χαρακτήρα (εκτός του χαρακτήρα αλλαγής γραμμής)
? : Η προηγούμενη έκφραση γίνεται optional. Ταιριάζει είτε ισχύει, είτε δεν ισχύει η προηγούμενη έκφραση.
* : Η προηγούμενη έκφραση πρέπει να υπάρχει 0 ή περισσότερες φορές. (Μοιάζει με το +, αλλά προσοχή, το + απαιτεί τουλάχιστον 1 φορά να υπάρχει η προηγούμενη έκφραση)
[^a-z]: Το ^ στην αρχή σημαίνει ότι θέλουμε οποιονδήποτε χαρακτήρα εκτός από όσα βρίσκονται στο εύρος a-z.

Για περισσότερες πληροφορίες googlάρετε ή αν βαριέστε LetMeGoogleThatForYou.

2 comments:

  1. Μια συναρτησούλα για έλεγχο έγκυρης σύνταξης των e-mail:
    http://www.freestuff.gr/forums/viewtopic.php?p=488912

    'γεια μας! c|_|

    ReplyDelete