Πώς να χρησιμοποιήσετε τις βασικές κανονικές εκφράσεις για καλύτερη αναζήτηση και εξοικονόμηση χρόνου
Είτε έχετε ψάξει με το Grep, είτε κοιτάζοντας προγράμματα που μπορούν να μετονομάσουν τα αρχεία για εσάς, ίσως αναρωτηθήκατε αν υπήρχε ένας ευκολότερος τρόπος για να ολοκληρώσετε τη δουλειά σας. Ευτυχώς, υπάρχει, και ονομάζεται "κανονικές εκφράσεις".
(Comic από το XKCD.com)
Τι είναι οι Κανονικές εκφράσεις?
Οι κανονικές εκφράσεις είναι δηλώσεις μορφοποιημένες με έναν πολύ συγκεκριμένο τρόπο και που μπορούν να σταθούν για πολλά διαφορετικά αποτελέσματα. Επίσης γνωστό ως "regex" ή "regexp", χρησιμοποιούνται κυρίως στις λειτουργίες ονομασίας αναζήτησης και αρχείων. Ένα regex μπορεί να χρησιμοποιηθεί σαν ένας τύπος για να δημιουργήσει μια σειρά διαφορετικών δυνατών αποτελεσμάτων, όλα τα οποία αναζητούνται. Εναλλακτικά, μπορείτε να ορίσετε τον τρόπο ονοματοδοσίας μιας ομάδας αρχείων, καθορίζοντας ένα regex και το λογισμικό σας μπορεί να μετακινηθεί προοδευτικά στην επόμενη προβλεπόμενη έξοδο. Με αυτόν τον τρόπο, μπορείτε να μετονομάσετε πολλά αρχεία σε πολλούς φακέλους πολύ εύκολα και αποτελεσματικά και μπορείτε να προχωρήσετε πέρα από τους περιορισμούς ενός απλού συστήματος αρίθμησης.
Επειδή η χρήση των κανονικών εκφράσεων βασίζεται σε μια ειδική σύνταξη, το πρόγραμμά σας πρέπει να μπορεί να τα διαβάζει και να τα αναλύει. Πολλά προγράμματα μετονομασίας αρχείων παρτίδας για Windows και OS X έχουν υποστήριξη για regexps, καθώς και το εργαλείο αναζήτησης GREP (το οποίο περιγράψαμε στο Bash Scripting for Beginners Guide) και το εργαλείο γραμμής εντολών Awk για το * Nix. Επιπλέον, πολλοί εναλλακτικοί διαχειριστές αρχείων, εκτοξευτές και εργαλεία αναζήτησης τα χρησιμοποιούν και έχουν πολύ σημαντική θέση στις γλώσσες προγραμματισμού όπως το Perl και το Ruby. Άλλα περιβάλλοντα ανάπτυξης, όπως το .NET, Java και Python, καθώς και η επερχόμενη C ++ 11, παρέχουν όλες τις τυπικές βιβλιοθήκες για τη χρήση κανονικών εκφράσεων. Όπως μπορείτε να φανταστείτε, μπορεί να είναι πραγματικά χρήσιμο όταν προσπαθείτε να ελαχιστοποιήσετε το ποσό του κώδικα που βάζετε σε ένα πρόγραμμα.
Μια σημείωση για τους χαρακτήρες που διαφεύγουν
Πριν σας δείξουμε παραδείγματα, θα θέλαμε να επισημάνω κάτι. Θα χρησιμοποιήσουμε το κέλυφος bash και την εντολή grep για να σας δείξουμε πώς να εφαρμόζετε κανονικές εκφράσεις. Το πρόβλημα είναι ότι μερικές φορές θέλουμε να χρησιμοποιήσουμε ειδικούς χαρακτήρες που πρέπει να μεταβιβαστούν στο grep και το κέλυφος bash θα ερμηνεύσει αυτόν τον χαρακτήρα επειδή το κέλυφος το χρησιμοποιεί επίσης. Υπό αυτές τις συνθήκες, πρέπει να «ξεφύγουμε» από αυτούς τους χαρακτήρες. Αυτό μπορεί να προκαλέσει σύγχυση επειδή αυτή η "διαφυγή" χαρακτήρων εμφανίζεται επίσης μέσα σε regexps. Για παράδειγμα, εάν θέλουμε να εισέλθουμε σε grep:
\<
θα πρέπει να το αντικαταστήσουμε με:
\\\<
Κάθε ειδικός χαρακτήρας εδώ παίρνει μία ανάστροφη κάθετο. Εναλλακτικά, μπορείτε επίσης να χρησιμοποιήσετε μεμονωμένα εισαγωγικά:
'\<'
Ενιαία αποσπάσματα λένε bash ΔΕΝ να ερμηνεύσει τι είναι μέσα τους. Ενώ απαιτούμε να γίνουν αυτά τα βήματα, ώστε να μπορέσουμε να αποδείξουμε για σας, τα προγράμματά σας (ειδικά τα βασισμένα σε GUI) συχνά δεν θα απαιτούν αυτά τα επιπλέον βήματα. Για να διατηρήσετε τα πράγματα απλά και απλά, η πραγματική κανονική έκφραση θα σας δοθεί ως αναφερόμενο κείμενο και θα δείτε τη διαφυγόντα σύνταξη στα screenshots της γραμμής εντολών.
Πώς επεκτείνονται?
Τα Regexps είναι ένας πολύ σύντομος τρόπος δήλωσης των όρων, ώστε ο υπολογιστής σας να μπορεί να τα επεκτείνει σε πολλαπλές επιλογές. Ας ρίξουμε μια ματιά στο ακόλουθο παράδειγμα:
tom [0123456789]
Οι τετράγωνες αγκύλες - [και] - λένε στον μηχανισμό ανάλυσης ότι οτιδήποτε υπάρχει μέσα, οποιοσδήποτε χαρακτήρας μπορεί να χρησιμοποιηθεί για να ταιριάξει. Ό, τι βρίσκεται μέσα σε αυτές τις αγκύλες ονομάζεται σετ χαρακτήρων.
Έτσι, εάν είχαμε ένα τεράστιο κατάλογο εγγραφών και χρησιμοποιήσαμε αυτό το regex για αναζήτηση, θα συμφωνούσαν οι ακόλουθοι όροι:
- κάποιος
- tom0
- tom1
- tom2
- tom3
και ούτω καθεξής. Ωστόσο, η παρακάτω λίστα ΔΕΝ θα ταιριάζει, και έτσι ΔΕΝ εμφανίζονται στα αποτελέσματά σας:
- ντομάτα ; το regex δεν λαμβάνει υπόψη τα γράμματα μετά το "tom"
- Tom; στο regex γίνεται διάκριση πεζών-κεφαλαίων!
Μπορείτε επίσης να επιλέξετε να πραγματοποιήσετε αναζήτηση με μια περίοδο (.) Που θα επιτρέψει την εμφάνιση οποιουδήποτε χαρακτήρα, εφόσον υπάρχει ένας χαρακτήρας.
Όπως μπορείτε να δείτε, παίζετε με
.κάποιος
δεν έφερε όρους που μόνο είχαν "tom" στην αρχή. Ακόμα και οι «πράσινες ντομάτες» ήρθαν, επειδή ο χώρος πριν από τον «τομ» μετράει ως χαρακτήρας, αλλά οι όροι "tomF" δεν είχαν χαρακτήρα στην αρχή και έτσι αγνοήθηκαν.
Σημείωση: Η προεπιλεγμένη συμπεριφορά του Grep είναι να επιστρέψει ολόκληρη τη γραμμή κειμένου όταν κάποιο τμήμα ταιριάζει με το regex. Άλλα προγράμματα μπορεί να μην το κάνουν και μπορείτε να το απενεργοποιήσετε με grep με τη σημαία '-o'.
Μπορείτε επίσης να ορίσετε εναλλαγή χρησιμοποιώντας ένα σωλήνα (|), όπως εδώ:
speciali (s | z) ε
Αυτό θα βρει και τα δύο:
- ειδικεύομαι
- ειδικεύομαι
Όταν χρησιμοποιούμε την εντολή grep, πρέπει να ξεφύγουμε από τους ειδικούς χαρακτήρες (, |, και) με backslash καθώς και να χρησιμοποιήσουμε τη σημαία '-E' για να το δούμε και να αποφύγουμε τα άσχημα λάθη.
Όπως αναφέρθηκε παραπάνω, αυτό οφείλεται στο γεγονός ότι πρέπει να πούμε στο κέλυφος bash να περάσει αυτούς τους χαρακτήρες στο grep και να μην κάνει τίποτα μαζί τους. Η σημαία '-E' λέει στο grep να χρησιμοποιεί τις παρενθέσεις και τους σωλήνες ως ειδικούς χαρακτήρες.
Μπορείτε να αναζητήσετε με αποκλεισμό χρησιμοποιώντας μια αγκίστρωση που βρίσκεται μέσα στις αγκύλες σας και στην αρχή ενός συνόλου:
tom [^ F | 0-9]
Και πάλι, αν χρησιμοποιείτε grep και bash, θυμηθείτε να ξεφύγετε από τον σωλήνα!
Όροι που ήταν στη λίστα αλλά δεν εμφανίστηκαν είναι:
- tom0
- tom5
- tom9
- tomF
Αυτά δεν ταιριάζουν με το regex μας.
Πώς μπορώ να χρησιμοποιήσω περιβάλλοντα?
Συχνά ψάχνουμε με βάση τα όρια. Μερικές φορές θέλουμε μόνο τις συμβολοσειρές που εμφανίζονται στην αρχή μιας λέξης, στο τέλος μιας λέξης ή στο τέλος μιας γραμμής κώδικα. Αυτό μπορεί εύκολα να γίνει χρησιμοποιώντας αυτό που ονομάζουμε άγκυρες.
Χρησιμοποιώντας μια καρφίτσα (εκτός των παρενθέσεων) σας επιτρέπει να ορίσετε την "αρχή" μιας γραμμής.
^ τομ
Για να αναζητήσετε το τέλος μιας γραμμής, χρησιμοποιήστε το σύμβολο του δολαρίου.
tom $
Μπορείτε να δείτε ότι η συμβολοσειρά αναζήτησης έρχεται ΠΡΙΝ την άγκυρα σε αυτή την περίπτωση.
Μπορείτε επίσης να κάνετε αγώνες που εμφανίζονται στην αρχή ή στο τέλος των λέξεων, όχι ολόκληρες γραμμές.
\
tom \>
Όπως αναφέρθηκε στο σημείωμα στην αρχή αυτού του άρθρου, πρέπει να ξεφύγουμε από αυτούς τους ειδικούς χαρακτήρες επειδή χρησιμοποιούμε bash. Εναλλακτικά, μπορείτε επίσης να χρησιμοποιήσετε μεμονωμένα εισαγωγικά:
Τα αποτελέσματα είναι τα ίδια. Βεβαιωθείτε ότι χρησιμοποιείτε μόνο αποσπάσματα και όχι διπλά εισαγωγικά.
Άλλοι πόροι για Advanced Regexps
Έχουμε χτυπήσει μόνο την άκρη του παγόβουνου εδώ. Μπορείτε επίσης να αναζητήσετε όρους χρημάτων που οριοθετούνται από το δείκτη νομίσματος και να αναζητήσετε τρεις ή περισσότερους όρους αντιστοίχισης. Τα πράγματα μπορούν να γίνουν πολύ περίπλοκα. Αν ενδιαφέρεστε να μάθετε περισσότερα σχετικά με τις κανονικές εκφράσεις, παρακαλούμε να ρίξετε μια ματιά στις ακόλουθες πηγές.
- Το Zytrax.com έχει μερικές σελίδες με συγκεκριμένα παραδείγματα για το τι συμβαίνει και δεν ταιριάζει.
- Το Regular-Expressions.info έχει επίσης έναν οδηγό δολοφόνος σε πολλά πιο προηγμένα πράγματα, καθώς και μια εύχρηστη σελίδα αναφοράς.
- Το Gnu.org έχει μια σελίδα αφιερωμένη στη χρήση regexps με grep.
Μπορείτε επίσης να δημιουργήσετε και να δοκιμάσετε τις κανονικές εκφράσεις σας χρησιμοποιώντας ένα δωρεάν ηλεκτρονικό εργαλείο Flash που ονομάζεται RegExr. Λειτουργεί όπως πληκτρολογείτε, είναι δωρεάν και μπορεί να χρησιμοποιηθεί στα περισσότερα προγράμματα περιήγησης.
Έχετε μια αγαπημένη χρήση για κανονικές εκφράσεις; Γνωρίζετε ένα μεγάλο barn renamer που τις χρησιμοποιεί; Ίσως θέλετε απλά να καυχηθείτε για το grep-fu σας. Συμβάλλετε στις σκέψεις σας σχολιάζοντας!