Τι είναι οι κανονικές εκφράσεις;
Οι τακτικές εκφράσεις βοηθούν στην αναζήτηση δεδομένων που ταιριάζουν με πολύπλοκα κριτήρια. Κοιτάξαμε μπαλαντέρ στο προηγούμενο σεμινάριο. Εάν έχετε συνεργαστεί με χαρακτήρες μπαλαντέρ στο παρελθόν, μπορεί να ρωτάτε γιατί να μάθετε κανονικές εκφράσεις όταν μπορείτε να λάβετε παρόμοια αποτελέσματα χρησιμοποιώντας τους χαρακτήρες μπαλαντέρ. Διότι, σε σύγκριση με τους χαρακτήρες μπαλαντέρ, οι κανονικές εκφράσεις μας επιτρέπουν να αναζητήσουμε δεδομένα που ταιριάζουν ακόμη πιο περίπλοκο κριτήριο.
Βασική σύνταξη
Η βασική σύνταξη για μια κανονική έκφραση έχει ως εξής
SELECT statements… WHERE fieldname REGEXP 'pattern';
ΕΔΩ -
- "SELECT δηλώσεις ..." είναι η τυπική πρόταση SELECT
- "WHERE fieldname" είναι το όνομα της στήλης στην οποία πρέπει να εκτελείται η κανονική έκφραση.
- "REGEXP" pattern "" Το REGEXP είναι ο κανονικός τελεστής έκφρασης και το "pattern" αντιπροσωπεύει το μοτίβο που θα ταιριάζει με το REGEXP. Το RLIKE είναι το συνώνυμο του REGEXP και επιτυγχάνει τα ίδια αποτελέσματα με το REGEXP. Για να αποφύγετε τη σύγχυση με τον χειριστή LIKE, καλύτερα να χρησιμοποιήσετε το REGEXP .
Ας δούμε τώρα ένα πρακτικό παράδειγμα-
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
Το παραπάνω ερώτημα αναζητά όλους τους τίτλους ταινιών που περιέχουν τον κωδικό λέξης. Δεν έχει σημασία αν ο "κωδικός" βρίσκεται στην αρχή, στη μέση ή στο τέλος του τίτλου. Εφόσον περιέχεται στον τίτλο τότε θα εξεταστεί.
Ας υποθέσουμε ότι θέλουμε να αναζητήσουμε ταινίες που ξεκινούν με a, b, c ή d, ακολουθούμενες από οποιονδήποτε αριθμό άλλων χαρακτήρων, πώς θα επιτύχαμε αυτό. Μπορούμε να χρησιμοποιήσουμε μια κανονική έκφραση μαζί με τους μεταχαρακτήρες για να επιτύχουμε τα επιθυμητά αποτελέσματα.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Η εκτέλεση του παραπάνω σεναρίου στον πάγκο εργασίας MySQL έναντι του myflixdb μας δίνει τα ακόλουθα αποτελέσματα.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
4 | Code Name Black | Edgar Jimz | 2010 | NULL |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
6 | Angels and Demons | NULL | 2007 | 6 |
7 | Davinci Code | NULL | 2007 | 6 |
Ας ρίξουμε μια προσεκτική ματιά στην τακτική έκφραση που είναι υπεύθυνη για το παραπάνω αποτέλεσμα.
«[abcd]» το caret (^) σημαίνει ότι η αντιστοίχιση μοτίβου θα πρέπει να εφαρμόζεται στην αρχή και η λίστα χαρακτήρων [abcd] σημαίνει ότι μόνο οι τίτλοι ταινιών που ξεκινούν με a, b, c ή d επιστρέφονται στο σύνολο αποτελεσμάτων μας.
Ας τροποποιήσουμε το παραπάνω σενάριό μας και χρησιμοποιήστε τη λίστα ΟΧΙ και δείτε τι αποτελέσματα θα πάρουμε μετά την εκτέλεση του ερωτήματός μας.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Η εκτέλεση του παραπάνω σεναρίου στον πάγκο εργασίας MySQL έναντι του myflixdb μας δίνει τα ακόλουθα αποτελέσματα.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
1 | Pirates of the Caribean 4 | Rob Marshall | 2011 | 1 |
2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
3 | X-Men | 2008 | ||
9 | Honey mooners | John Schultz | 2005 | 8 |
16 | 67% Guilty | 2012 | ||
17 | The Great Dictator | Chalie Chaplie | 1920 | 7 |
18 | sample movie | Anonymous | 8 | |
19 | movie 3 | John Brown | 1920 | 8 |
Ας ρίξουμε μια προσεκτική ματιά στην τακτική έκφραση που είναι υπεύθυνη για τα παραπάνω αποτελέσματα.
«[abcd]» το caret (^) σημαίνει ότι η αντιστοίχιση μοτίβου θα πρέπει να εφαρμοστεί στην αρχή και η λίστα χαρακτήρων [abcd] σημαίνει ότι οι τίτλοι ταινιών που ξεκινούν με οποιονδήποτε από τους χαρακτήρες που περιλαμβάνονται στην εικόνα εξαιρούνται από το σύνολο αποτελεσμάτων.
Μεταχαρακτήρες κανονικής έκφρασης
Αυτό που εξετάσαμε στο παραπάνω παράδειγμα είναι η απλούστερη μορφή μιας κανονικής έκφρασης. Ας δούμε τώρα πιο προχωρημένους αγώνες μοτίβου κανονικής έκφρασης. Ας υποθέσουμε ότι θέλουμε να αναζητήσουμε τίτλους ταινιών που ξεκινούν με το μοτίβο "κωδικός" χρησιμοποιώντας μόνο μια κανονική έκφραση, πώς θα το κάνουμε; Η απάντηση είναι μεταχαρακτήρες. Μας επιτρέπουν να προσαρμόζουμε τα αποτελέσματα αναζήτησης μοτίβων χρησιμοποιώντας κανονικές εκφράσεις.
Απανθρακώνω | Περιγραφή | Παράδειγμα | |
---|---|---|---|
* | Ο μετα-χαρακτήρας του αστερίσκου (*) χρησιμοποιείται για να ταιριάζει με μηδέν (0) ή περισσότερες εμφανίσεις των συμβολοσειρών που προηγούνται | ΕΠΙΛΟΓΗ * ΑΠΟ ταινίες ΠΟΥ ΑΦΟΡΑ τον τίτλο REGEXP 'da *'; θα δώσει όλες τις ταινίες που περιέχουν χαρακτήρες "da". Για παράδειγμα, Da Vinci Code, Daddy's Little Girls. | |
+ | Ο μετα-χαρακτήρας συν (+) χρησιμοποιείται για να ταιριάζει με μία ή περισσότερες εμφανίσεις συμβολοσειρών που προηγούνται. | ΕΠΙΛΕΞΤΕ * ΑΠΟ "ταινίες" ΠΟΥ "τίτλος" REGEXP "mon +"; θα δώσει όλες τις ταινίες που περιέχουν χαρακτήρες "mon". Για παράδειγμα, Angels and Demons. | |
; | Ο μεταχαρακτήρας της ερώτησης (?) Χρησιμοποιείται για να ταιριάζει με το μηδέν (0) ή μία παρουσία των συμβολοσειρών που προηγούνται. | ΕΠΙΛΟΓΗ * ΑΠΟ «κατηγορίες» ΠΟΥ «Category_name» REGEXP «com;»; θα δώσει όλες τις κατηγορίες που περιέχουν string com. Για παράδειγμα, κωμωδία, ρομαντική κωμωδία. | |
. | Ο μετα-χαρακτήρας κουκκίδας (.) Χρησιμοποιείται για να ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα εκτός από μια νέα γραμμή. | ΕΠΙΛΟΓΗ * ΑΠΟ ταινίες ΠΟΥ "έτος_κυκλοφόρησε" REGEXP "200."; θα δώσει όλες τις ταινίες που κυκλοφόρησαν τα χρόνια ξεκινώντας με χαρακτήρες "200" ακολουθούμενες από οποιονδήποτε μεμονωμένο χαρακτήρα. Για παράδειγμα, 2005.2007.2008 κ.λπ. | |
[αλφάβητο] | Η λίστα χαρακτήρων [abc] χρησιμοποιείται για να ταιριάζει με οποιονδήποτε από τους εσωκλειόμενους χαρακτήρες. | ΕΠΙΛΕΞΤΕ * ΑΠΟ "ταινίες" ΠΟΥ "τίτλος" REGEXP "[vwxyz]". θα δώσει όλες τις ταινίες που περιέχουν έναν μόνο χαρακτήρα στο "vwxyz". Για παράδειγμα, X-Men, Da Vinci Code κ.λπ. | |
[abc] | Η λίστα χαρακτήρων [abc] χρησιμοποιείται για την αντιστοίχιση οποιωνδήποτε χαρακτήρων εκτός από αυτούς που περικλείονται. | ΕΠΙΛΕΞΤΕ * ΑΠΟ "ταινίες" ΠΟΥ "τίτλος" REGEXP "[vwxyz]"; θα δώσει όλες τις ταινίες που περιέχουν χαρακτήρες διαφορετικούς από αυτούς στο "vwxyz". | |
[ΑΖ] | Το [AZ] χρησιμοποιείται για να ταιριάζει με κάθε κεφαλαίο γράμμα. | ΕΠΙΛΕΞΤΕ * ΑΠΟ «μέλη` ΠΟΥ« postal_address «REGEXP» [AZ] ». θα δώσει σε όλα τα μέλη που έχουν ταχυδρομική διεύθυνση που περιέχει οποιονδήποτε χαρακτήρα από το Α έως το Ω… Για παράδειγμα, η Janet Jones με αριθμό μέλους 1. | |
[αζ] | Το [az] χρησιμοποιείται για να ταιριάζει με κάθε πεζό γράμμα | ΕΠΙΛΕΞΤΕ * ΑΠΟ «μέλη` ΠΟΥ« postal_address` REGEXP »[az]». θα δώσει σε όλα τα μέλη που έχουν ταχυδρομικές διευθύνσεις που περιέχουν οποιοδήποτε χαρακτήρα από το a έως το z… Για παράδειγμα, η Janet Jones με αριθμό μέλους 1. | |
[0-9] | Το [0-9] χρησιμοποιείται για να ταιριάξει οποιοδήποτε ψηφίο από 0 έως 9. | SELECT * FROM `member` WHERE` contact_number` REGEXP '[0-9]' θα δώσει σε όλα τα μέλη που έχουν υποβάλει αριθμούς επαφής που περιέχουν χαρακτήρες "[0-9]". Για παράδειγμα, ο Robert Phil. | |
^ | Το caret (^) χρησιμοποιείται για να ξεκινήσει ο αγώνας στην αρχή. | ΕΠΙΛΕΞΤΕ * ΑΠΟ "ταινίες" ΠΟΥ "τίτλος" REGEXP "[cd]"; δίνει όλες τις ταινίες με τίτλο ξεκινώντας με οποιονδήποτε από τους χαρακτήρες στο "cd". Για παράδειγμα, Code Name Black, Daddy's Little Girls και Da Vinci Code. | |
| | Η κάθετη ράβδος (|) χρησιμοποιείται για την απομόνωση εναλλακτικών λύσεων. | ΕΠΙΛΕΞΤΕ * ΑΠΟ «ταινίες» ΠΟΥ «τίτλος« REGEXP »[cd] | [u]»; δίνει όλες τις ταινίες με τον τίτλο ξεκινώντας με οποιονδήποτε από τους χαρακτήρες στο "cd" ή "u". Για παράδειγμα, Code Name Black, Daddy's Little Girl, Da Vinci Code και Underworld - Awakening. | |
[[: <:]] | Το [[: <:]] αντιστοιχεί στην αρχή των λέξεων. | ΕΠΙΛΕΞΤΕ * ΑΠΟ "ταινίες" ΠΟΥ "τίτλος" REGEXP "[[: <:]] για"; δίνει όλες τις ταινίες με τίτλους που ξεκινούν με τους χαρακτήρες. Για παράδειγμα: Ξεχνώντας τη Σάρσαρ. | |
[[:>:]] | Το [[:>:]] αντιστοιχεί στο τέλος των λέξεων. | ΕΠΙΛΕΞΤΕ * ΑΠΟ "ταινίες" ΠΟΥ "τίτλος" REGEXP "ack [[:>:]]"; δίνει όλες τις ταινίες με τίτλους που τελειώνουν με τους χαρακτήρες "ack". Για παράδειγμα, Code Name Black. | |
[:τάξη:] | Το [: class:] ταιριάζει με μια κλάση χαρακτήρων, δηλαδή [: alpha:] για να ταιριάζει με γράμματα, [: space:] για να ταιριάζει με το κενό διάστημα, [: punct:] είναι τα σημεία στίξης και [: άνω:] για γράμματα ανώτερης τάξης. | ΕΠΙΛΕΞΤΕ * ΑΠΟ "ταινίες" ΠΟΥ "τίτλος" REGEXP "[: alpha:]"; δίνει όλες τις ταινίες με τίτλους που περιέχουν μόνο γράμματα. Για παράδειγμα, ξεχνώντας τη Sarah Marshal, X-Men κ.λπ. Ταινίες όπως οι Πειρατές της Καραϊβικής 4 θα παραλειφθούν από αυτό το ερώτημα. |
Η ανάστροφη κάθετο (\) χρησιμοποιείται ως χαρακτήρας διαφυγής. Εάν θέλουμε να το χρησιμοποιήσουμε ως μέρος του μοτίβου σε μια κανονική έκφραση, θα πρέπει να χρησιμοποιήσουμε διπλές ανάστροφες παύλες (\\)
Περίληψη
- Οι τακτικές εκφράσεις παρέχουν μια ισχυρή και ευέλικτη αντιστοίχιση μοτίβων που μπορεί να μας βοηθήσει να εφαρμόσουμε βοηθητικά προγράμματα αναζήτησης ενέργειας για τα συστήματα βάσης δεδομένων μας.
- Το REGEXP είναι ο τελεστής που χρησιμοποιείται κατά την εκτέλεση τακτικών μοτίβων κανονικής έκφρασης Το RLIKE είναι το συνώνυμο
- Οι κανονικές εκφράσεις υποστηρίζουν έναν αριθμό μεταχαρακτήρων που επιτρέπουν περισσότερη ευελιξία και έλεγχο κατά την εκτέλεση αντιστοιχιών μοτίβου.
- Η ανάστροφη κάθετο χρησιμοποιείται ως χαρακτήρας διαφυγής σε κανονικές εκφράσεις. Λαμβάνεται υπόψη στον αγώνα μοτίβου εάν έχουν χρησιμοποιηθεί διπλές ανάστροφες παύλες.
- Οι τυπικές εκφράσεις δεν είναι πεζά.