Mar 18, 2007

Αναζήτηση κειμένου με χρήση regular expressions

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

Για παράδειγμα, τις τελευταίες ημέρες ήρθα αντιμέτωπος με τη συντήρηση ενός κώδικα, όπου στις exception handling περιπτώσεις δεν υπήρχε καθόλου διαχείριση του catch() block, δηλαδή με άλλα λόγια ήταν κενό ({}) και δεν τυπώνονταν καν ένα μήνυμα για το είδος του exception που συνέβηκε στα log files. Είναι δύσκολο να ανιχνευτούν αυτές οι περιπτώσεις από μια τυπική αναζήτηση κειμένου καθώς οι αγκύλες του catch block μπορούν να εκτείνονται σε να βρίσκονται στην ίδια γραμμή ή να εκτείνονται σε πολλαπλές γραμμές. Η λύση τότε είναι να πραγματοποιηθεί η αναζήτηση με την χρήση κανονικών εκφράσεων (regular expressions) στις οποίες θα προσδιοριστεί η μορφή του κειμένου που θέλουμε να βρούμε. Οι κανονικές εκφράσεις μας επιτρέπουν να ψάξουμε ένα κείμενο για την εύρεση στοιχείων που έχουν μια συγκεκριμένη μορφή την οποία ορίζουμε. Θέλοντας για παράδειγμα να βρούμε όλα τα σημεία στον κώδικά μας που περιλαμβάνουν μεταβλητές που ξεκινούν από ένα ή περισσότερα γράμματα και καταλήγουν σε αριθμούς, η κανονική έκφραση θα είναι: [a-z,A-Z]+[0-9]+, δηλαδή που θα διαθέτει γράμματα πεζά ή κεφαλαία του λατινικού αλφαβήτου, ένα ή περισσότερα (αυτό το ρόλο παίζει ο χαρακτήρας '+') και έπονται ένα ή περισσότερα αριθμητικά ψηφία. Για να ενεργοποιήσουμε αυτήν την έκφραση διαλέγουμε την επιλογή "Regular expressions" στην οθόνη αναζήτησης του JDeveloper.


Οι κανονικές εκφράσεις που μπορούν να χρησιμοποιηθούν είναι συμβατές με τη μορφή που ορίζεται στο JDK 1.4, ενώ κατατοπιστικές πληροφορίες βρίσκονται στο: http://www.siteexperts.com/tips/functions/ts23/page1.asp Στην περίπτωση μας, η καρδιά της αναζήτησης έχει να κάνει με την εύρεση αγκυλών (που ως χαρακτήρες με ιδιαίτερη σημασία συμβολίζονται ως \{) που ακολουθούνται από μηδέν ή περισσότερα κενά διαστήματα ή αλλαγές γραμμών (που συμβολίζονται με τον χαρακτήρα \s) Με άλλα λόγια, της μορφής:

\{\s*\}

Έαν προσθέσουμε σε αυτό, και την αναζήτηση του κειμένου Exception νωρίτερα (γιατί η προηγούμενη έκφρασή μας θα μας επιστέψει όλα τα κενά blocks, πχ empty constructors) τότε φθάνουμε στην τελική έκφραση που θα μας εμφανίσει όλα τα κενά catch blocks.

Exception\s[a-z]+\)\s*\{\s*\}

No comments: