Πίνακας περιεχομένων
Σε αυτό το σεμινάριο, θα εξετάσουμε σε βάθος πώς να χρησιμοποιούμε regex για την αντιστοίχιση συμβολοσειρών στο Excel.
Όταν πρέπει να βρείτε μια συγκεκριμένη τιμή σε μια περιοχή κελιών, θα χρησιμοποιήσετε τη συνάρτηση MATCH ή XMATCH. Όταν ψάχνετε για μια συγκεκριμένη συμβολοσειρά σε ένα κελί, οι λειτουργίες FIND και SEARCH είναι χρήσιμες. Και πώς ξέρετε αν ένα κελί περιέχει πληροφορίες που ταιριάζουν με ένα συγκεκριμένο μοτίβο; Προφανώς, με τη χρήση κανονικών εκφράσεων. Αλλά out of the box το Excel δεν υποστηρίζει regexes! Μην ανησυχείτε, θα το αναγκάσουμε να το κάνει :)
Συνάρτηση Regex του Excel VBA για την αντιστοίχιση συμβολοσειρών
Όπως είναι αρκετά σαφές από τον τίτλο, για να χρησιμοποιήσετε τις κανονικές εκφράσεις στο Excel, πρέπει να δημιουργήσετε τη δική σας συνάρτηση. Ευτυχώς, η VBA του Excel διαθέτει μια ενσωματωμένη RegExp αντικείμενο, το οποίο μπορείτε να χρησιμοποιήσετε στον κώδικά σας όπως φαίνεται παρακάτω:
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'πίνακας για την αποθήκευση των αποτελεσμάτων Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'δείκτης της τρέχουσας γραμμής στην περιοχή προέλευσης, δείκτης της τρέχουσας στήλης στην περιοχή προέλευσης, count of rows, count of columns On Error GoTo ErrHandlRegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True End If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End FunctionΕπικολλήστε τον κώδικα στον επεξεργαστή VBA και το νέο σας RegExpMatch Αν δεν έχετε μεγάλη εμπειρία με το VBA, αυτός ο οδηγός μπορεί να σας βοηθήσει: Πώς να εισάγετε κώδικα VBA στο Excel.
Σημείωση. Αφού εισαγάγετε τον κώδικα, θυμηθείτε να αποθηκεύσετε το αρχείο σας ως βιβλίο εργασίας με δυνατότητα μακροεντολών (.xlsm).
Σύνταξη RegExpMatch
Το RegExpMatch Η συνάρτηση ελέγχει αν οποιοδήποτε μέρος της αρχικής συμβολοσειράς ταιριάζει με μια κανονική έκφραση. Το αποτέλεσμα είναι μια τιμή Boolean: TRUE αν βρέθηκε τουλάχιστον μια αντιστοιχία, FALSE διαφορετικά.
Η προσαρμοσμένη μας συνάρτηση έχει 3 ορίσματα - τα δύο πρώτα είναι υποχρεωτικά και το τελευταίο είναι προαιρετικό:
RegExpMatch(text, pattern, [match_case])Πού:
- Κείμενο (υποχρεωτικό) - μία ή περισσότερες συμβολοσειρές για αναζήτηση. Μπορεί να παρέχεται ως αναφορά κελιού ή περιοχής.
- Μοτίβο (υποχρεωτικό) - η κανονική έκφραση που πρέπει να ταιριάζει. Όταν τοποθετείται απευθείας σε έναν τύπο, ένα μοτίβο πρέπει να περικλείεται σε διπλά εισαγωγικά.
- Match_case (προαιρετικό) - καθορίζει τον τύπο αντιστοίχισης. Εάν TRUE ή παραλειφθεί (προεπιλογή), πραγματοποιείται αντιστοίχιση με ευαισθησία στη πεζότητα- εάν FALSE - χωρίς ευαισθησία στη πεζότητα.
Η λειτουργία λειτουργεί σε όλες τις εκδόσεις του Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 και Excel 2010.
3 πράγματα που πρέπει να γνωρίζετε για το RegExpMatch
Πριν περάσουμε στους πρακτικούς υπολογισμούς, παρακαλούμε να λάβετε υπόψη σας τα ακόλουθα σημεία που διευκρινίζουν ορισμένες τεχνικές λεπτομέρειες:
- Η συνάρτηση μπορεί να επεξεργαστεί ένα μεμονωμένο κύτταρο ή εύρος κυττάρων Στην τελευταία περίπτωση, τα αποτελέσματα επιστρέφονται στα γειτονικά κελιά με τη μορφή ενός δυναμικού πίνακα ή μιας περιοχής διαρροής, όπως φαίνεται σε αυτό το παράδειγμα.
- Από προεπιλογή, η συνάρτηση είναι case-sensitive Για να αγνοήσετε την πεζότητα κειμένου, ορίστε το match_case Λόγω των περιορισμών του VBA Regexp, δεν υποστηρίζεται το μοτίβο (?i) που δεν λαμβάνει υπόψη την πεζότητα.
- Αν δεν βρεθεί έγκυρο μοτίβο, η συνάρτηση επιστρέφει FALSE- αν το μοτίβο το μοτίβο είναι άκυρο , εμφανίζεται σφάλμα #VALUE!
Παρακάτω, θα βρείτε μερικά παραδείγματα αντιστοιχιών regex που δημιουργήθηκαν για σκοπούς επίδειξης. Δεν μπορούμε να εγγυηθούμε ότι τα μοτίβα μας θα λειτουργούν άψογα με ένα ευρύτερο φάσμα δεδομένων εισόδου στα πραγματικά φύλλα εργασίας σας. Πριν τα βάλετε στην παραγωγή, φροντίστε να δοκιμάσετε και να προσαρμόσετε τα μοτίβα των δειγμάτων μας σύμφωνα με τις ανάγκες σας.
Πώς να χρησιμοποιείτε regex για την αντιστοίχιση συμβολοσειρών στο Excel
Όταν όλες οι συμβολοσειρές που θέλετε να ταιριάξετε έχουν το ίδιο μοτίβο, οι κανονικές εκφράσεις αποτελούν ιδανική λύση.
Ας υποθέσουμε ότι έχετε μια σειρά κελιών (A5:A9) που περιέχουν διάφορες λεπτομέρειες σχετικά με ορισμένα αντικείμενα. Θέλετε να μάθετε ποια κελιά έχουν SKUs. Υποθέτοντας ότι κάθε SKU αποτελείται από 2 κεφαλαία γράμματα, μια παύλα και 3 ψηφία, μπορείτε να τα ταιριάξετε χρησιμοποιώντας την ακόλουθη έκφραση.
Μοτίβο : \b[A-Z]{2}-\d{3}\b
Όπου [A-Z]{2} σημαίνει 2 οποιαδήποτε κεφαλαία γράμματα από το Α έως το Ζ και \d{3} σημαίνει 3 οποιαδήποτε ψηφία από το 0 έως το 9. Ο χαρακτήρας \b υποδηλώνει ένα όριο λέξης, που σημαίνει ότι μια SKU είναι μια ξεχωριστή λέξη και όχι μέρος μιας μεγαλύτερης συμβολοσειράς, όπως 23-MAR-2022.
Με την καθιέρωση του μοτίβου, μπορούμε να προχωρήσουμε στη σύνταξη ενός τύπου. Ουσιαστικά, η χρήση μιας προσαρμοσμένης συνάρτησης δεν διαφέρει από μια εγγενή. Μόλις αρχίσετε να πληκτρολογείτε έναν τύπο, το όνομα της συνάρτησης θα εμφανιστεί στη λίστα που προτείνει η Αυτόματη συμπλήρωση του Excel. Ωστόσο, υπάρχουν μερικές αποχρώσεις στο Excel με δυναμική διάταξη (Microsoft 365 και Excel 2021) και στο παραδοσιακό Excel (2019 και παλαιότερες εκδόσεις).
Αντιστοιχία συμβολοσειράς σε ένα κελί
Για να ταιριάξετε μια συμβολοσειρά σε ένα μόνο κελί, αναφερθείτε σε αυτό το κελί στο πρώτο όρισμα. Το δεύτερο όρισμα υποτίθεται ότι περιέχει μια κανονική έκφραση.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Το μοτίβο μπορεί επίσης να διατηρηθεί σε ένα προκαθορισμένο κελί, το οποίο είναι κλειδωμένο με μια απόλυτη αναφορά ($A$2):
=RegExpMatch(A5, $A$2)
Αφού εισαγάγετε τον τύπο στο πρώτο κελί, μπορείτε να τον σύρετε προς τα κάτω σε όλες τις άλλες γραμμές.
Αυτή η μέθοδος λειτουργεί θαυμάσια σε όλες τις εκδόσεις του Excel .
Αντιστοίχιση συμβολοσειρών σε πολλαπλά κελιά ταυτόχρονα
Για να αντιστοιχίσετε πολλαπλές συμβολοσειρές με έναν μόνο τύπο, συμπεριλάβετε μια αναφορά περιοχής στο πρώτο όρισμα:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Στο Excel 365 και Excel 2021 που υποστηρίζουν δυναμικούς πίνακες, λειτουργεί ως εξής - πληκτρολογείτε τον τύπο στο πρώτο κελί, πατάτε Enter , και ο τύπος διαχέεται αυτόματα στα παρακάτω κελιά.
Στο Excel 2019 και νωρίτερα, λειτουργεί μόνο ως παραδοσιακός τύπος συστοιχίας CSE, ο οποίος εισάγεται σε μια περιοχή κελιών και ολοκληρώνεται με το ταυτόχρονο πάτημα των πλήκτρων Ctrl + Shift + Enter.
Regex για να ταιριάξει με τον αριθμό
Για να ταιριάξετε οποιοδήποτε μεμονωμένο ψηφίο από το 0 έως το 9, χρησιμοποιήστε το \d Ανάλογα με τη συγκεκριμένη εργασία σας, προσθέστε έναν κατάλληλο ποσοδείκτη ή δημιουργήστε ένα πιο σύνθετο μοτίβο.
Regex για να ταιριάζει με οποιονδήποτε αριθμό
Για να ταιριάξετε με οποιονδήποτε αριθμό οποιουδήποτε μήκους, βάλτε τον ποσοδείκτη + αμέσως μετά τον χαρακτήρα /d, ο οποίος λέει να αναζητήσετε αριθμούς που περιέχουν 1 ή περισσότερα ψηφία.
Μοτίβο : \d+
=RegExpMatch(A5:A9, "\d+")
Regex για να ταιριάζει με αριθμό συγκεκριμένου μήκους
Αν ο στόχος σας είναι να ταιριάξετε αριθμητικές τιμές που περιέχουν έναν ορισμένο αριθμό ψηφίων, τότε χρησιμοποιήστε \d μαζί με έναν κατάλληλο ποσοδείκτη.
Για παράδειγμα, για να ταιριάξετε με αριθμούς τιμολογίων που αποτελούνται ακριβώς από 7 ψηφία, θα χρησιμοποιούσατε \d{7}. Ωστόσο, λάβετε υπόψη σας ότι θα ταιριάξει με 7 ψηφία οπουδήποτε στη συμβολοσειρά, συμπεριλαμβανομένου ενός 10ψήφιου ή 100ψήφιου αριθμού. Αν δεν είναι αυτό που ψάχνετε, βάλτε το όριο λέξης \b και στις δύο πλευρές.
Μοτίβο : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex για την αντιστοίχιση τηλεφωνικών αριθμών
Δεδομένου ότι οι τηλεφωνικοί αριθμοί μπορούν να γραφούν σε διάφορες μορφές, η αντιστοίχισή τους απαιτεί μια πιο περίπλοκη κανονική έκφραση.
Στο παρακάτω σύνολο δεδομένων, θα αναζητήσουμε 10ψήφιους αριθμούς που έχουν 3 ψηφία στις 2 πρώτες ομάδες και 4 ψηφία στην τελευταία ομάδα. Οι ομάδες μπορούν να διαχωρίζονται με τελεία, παύλα ή κενό. Η πρώτη ομάδα μπορεί να περικλείεται ή να μην περικλείεται σε παρένθεση.
Μοτίβο: (\(\d{3}\)
Αν αναλύσουμε αυτή την κανονική έκφραση, έχουμε τα εξής:
- Το πρώτο μέρος (\(\d{3}\)
- Το μέρος [-\.\s]? σημαίνει 0 ή 1 εμφάνιση οποιουδήποτε χαρακτήρα σε αγκύλες: παύλα, τελεία ή κενό διάστημα.
- Στη συνέχεια, υπάρχει μια ακόμη ομάδα 3 ψηφίων d{3} ακολουθούμενη από οποιαδήποτε παύλα, τελεία ή κενό διάστημα [\-\.\s]; που εμφανίζεται 0 ή 1 φορά.
- Η τελευταία ομάδα 4 ψηφίων \d{4} ακολουθείται από ένα όριο λέξης \b για να καταστεί σαφές ότι ένας αριθμός τηλεφώνου δεν μπορεί να είναι μέρος ενός μεγαλύτερου αριθμού.
Με την αρχική συμβολοσειρά στο A5 και την κανονική έκφραση στο A2, ο τύπος έχει την εξής μορφή:
=RegExpMatch(A5, $A$2)
... και λειτουργεί ακριβώς όπως αναμενόταν:
Σημειώσεις:
- Οι διεθνείς κωδικοί δεν ελέγχονται, οπότε μπορεί να υπάρχουν ή να μην υπάρχουν.
- Στις κανονικές εκφράσεις, το \s σημαίνει οποιονδήποτε χαρακτήρα λευκού χώρου, όπως κενό, tab, carriage return ή νέα γραμμή. Για να επιτρέψετε μόνο κενά, χρησιμοποιήστε [-\. ] αντί για [-\.\s].
- [^13] θα ταιριάξει με οποιονδήποτε χαρακτήρα που δεν είναι 1 ή 3.
- [^1-3] θα ταιριάξει με κάθε χαρακτήρα που δεν είναι 1, 2 ή 3 (δηλαδή οποιοδήποτε ψηφίο από το 1 έως το 3).
- Η παραπάνω regex λειτουργεί μόνο για μονής γραμμής Στην περίπτωση των συμβολοσειρών milti-line, οι χαρακτήρες ^ και $ αντιστοιχούν στην αρχή και το τέλος κάθε γραμμής αντί για την αρχή και το τέλος της συμβολοσειράς εισόδου, επομένως η regex αναζητά μόνο στην πρώτη γραμμή.
- Για να ταιριάξετε συμβολοσειρές που μην ξεκινάτε με συγκεκριμένο κείμενο , χρησιμοποιήστε μια κανονική έκφραση όπως ^(?!lemons).*$
- Για να ταιριάξετε συμβολοσειρές που δεν τελειώνουν με συγκεκριμένο κείμενο , συμπεριλάβετε την άγκυρα της τελικής συμβολοσειράς στο μοτίβο αναζήτησης: ^(((?!lemons$).)*$
- Όνομα χρήστη μπορεί να περιλαμβάνει γράμματα, αριθμούς, υπογράμμιση, τελείες και παύλες. Έχοντας κατά νου ότι το \w ταιριάζει με οποιοδήποτε γράμμα, ψηφίο ή υπογράμμιση, έχουμε το ακόλουθο regex: [\w\.\-]+
- Όνομα τομέα μπορεί να περιλαμβάνει κεφαλαία και πεζά γράμματα, ψηφία, παύλες (αλλά όχι στην πρώτη ή την τελευταία θέση) και τελείες (σε περίπτωση υποτομέων). Δεδομένου ότι δεν επιτρέπονται οι υπογραμμίσεις, αντί για \w χρησιμοποιούμε 3 διαφορετικά σύνολα χαρακτήρων: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+
- Τομέας ανωτάτου επιπέδου αποτελείται από μια τελεία ακολουθούμενη από κεφαλαία και πεζά γράμματα. Μπορεί να περιέχει από 2 έως 24 γράμματα (το μεγαλύτερο TLD που υπάρχει σήμερα): \.[A-Za-z]{2,24}
- Παρέχετε μια αναφορά εύρους στο RegExpMatch, ώστε να επιστρέφει έναν πίνακα τιμών TRUE και FALSE.
- Χρησιμοποιήστε μια διπλή άρνηση (--) για να εξαναγκάσετε τις λογικές τιμές σε μονάδες και μηδενικά.
- Πάρτε τη συνάρτηση SUM για να προσθέσετε τα 1 και τα 0 στον πίνακα που προκύπτει.
- Στο Δεδομένα Ablebits στην καρτέλα Κείμενο ομάδα, κάντε κλικ στο Εργαλεία Regex .
- Στο Εργαλεία Regex παράθυρο, κάντε τα εξής:
- Επιλέξτε τις συμβολοσειρές προέλευσης.
- Εισάγετε το μοτίβο σας.
- Επιλέξτε το Αγώνας επιλογή.
- Για να έχετε τα αποτελέσματα ως τύπους και όχι ως τιμές, επιλέξτε την επιλογή Εισαγωγή ως τύπος πλαίσιο ελέγχου.
- Κάντε κλικ στο Αγώνας κουμπί.
- Η λειτουργία μπορεί να είναι εισάγεται απευθείας σε ένα κελί μέσω του προτύπου Λειτουργία εισαγωγής παράθυρο διαλόγου, όπου κατηγοριοποιείται στην κατηγορία AblebitsUDFs .
- Από προεπιλογή, μια κανονική έκφραση προστίθεται στον τύπο, αλλά μπορείτε επίσης να τη διατηρήσετε σε ξεχωριστό κελί. Για το σκοπό αυτό, χρησιμοποιήστε απλώς μια αναφορά κελιού για το 2ο όρισμα.
- Από προεπιλογή, η συνάρτηση είναι case-sensitive Για αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων, χρησιμοποιήστε το μοτίβο (?i).
Regex για να ΜΗΝ ταιριάζει με χαρακτήρα
Για να βρείτε συμβολοσειρές που ΔΕΝ περιέχουν έναν συγκεκριμένο χαρακτήρα, μπορείτε να χρησιμοποιήσετε κλάσεις χαρακτήρων με άρνηση [^ ] που ταιριάζουν με οτιδήποτε ΔΕΝ βρίσκεται σε παρένθεση. Για παράδειγμα:
Σε μια λίστα με τηλεφωνικούς αριθμούς, ας υποθέσουμε ότι θέλετε να βρείτε εκείνους που δεν έχουν κωδικό χώρας. Έχοντας υπόψη ότι κάθε διεθνής κωδικός περιλαμβάνει το σύμβολο +, μπορείτε να χρησιμοποιήσετε την κλάση χαρακτήρων [^\+] για να βρείτε συμβολοσειρές που δεν περιέχουν σύμβολο συν. Είναι σημαντικό να συνειδητοποιήσετε ότι η παραπάνω έκφραση ταιριάζει με οποιονδήποτε μεμονωμένο χαρακτήρα που δεν είναι +. Επειδή ένας τηλεφωνικός αριθμός μπορεί να βρίσκεται οπουδήποτε σε μια συμβολοσειρά, όχιαναγκαστικά στην αρχή, ο ποσοδείκτης * προστίθεται για να ελέγχει κάθε επόμενο χαρακτήρα. Οι άγκυρες αρχής ^ και τέλους $ διασφαλίζουν ότι επεξεργάζεται ολόκληρη η συμβολοσειρά. Ως αποτέλεσμα, έχουμε την παρακάτω κανονική έκφραση που λέει "μην ταιριάζετε με τον χαρακτήρα + σε καμία θέση της συμβολοσειράς".
Μοτίβο : ^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex για να ΜΗΝ ταιριάζει με συμβολοσειρά
Παρόλο που δεν υπάρχει ειδική σύνταξη κανονικής έκφρασης για τη μη ταύτιση μιας συγκεκριμένης συμβολοσειράς, μπορείτε να μιμηθείτε αυτή τη συμπεριφορά χρησιμοποιώντας αρνητικό lookahead.
Ας υποθέσουμε ότι θέλετε να βρείτε χορδές που δεν περιέχουν η λέξη "λεμόνια". Αυτή η κανονική έκφραση θα λειτουργήσει άψογα:
Μοτίβο : ^(((;!λεμόνια).)*$
Προφανώς, χρειάζονται κάποιες εξηγήσεις εδώ. Το αρνητικό lookahead (?!λεμόνια) κοιτάζει προς τα δεξιά για να δει αν δεν υπάρχει η λέξη "λεμόνια" μπροστά. Αν δεν υπάρχει η λέξη "λεμόνια", τότε η τελεία ταιριάζει με οποιονδήποτε χαρακτήρα εκτός από ένα διάλειμμα γραμμής. Η παραπάνω έκφραση εκτελεί μόνο έναν έλεγχο, και ο ποσοδείκτης * τον επαναλαμβάνει μηδέν ή περισσότερες φορές, από την αρχή της συμβολοσειράς που αγκυρώνεται από το ^ μέχρι το τέλος της συμβολοσειράς που αγκυρώνεται από το$.
Για να αγνοήσουμε την πεζότητα του κειμένου, θέτουμε το 3ο όρισμα σε FALSE για να καταστήσουμε τη συνάρτησή μας μη ευαίσθητη στην πεζότητα:
=RegExpMatch(A5, $A$2, FALSE)
Συμβουλές και σημειώσεις:
Αντιστοίχιση χωρίς ευαισθησία στην πεζότητα
Στις κλασικές κανονικές εκφράσεις, υπάρχει ένα ειδικό μοτίβο για την αντιστοίχιση χωρίς διαφορά πεζών και χαρακτήρων (?i), το οποίο δεν υποστηρίζεται στο VBA RegExp. Για να ξεπεραστεί αυτός ο περιορισμός, η προσαρμοσμένη μας συνάρτηση δέχεται το 3ο προαιρετικό όρισμα με το όνομα match_case Για να κάνετε αντιστοίχιση χωρίς ευαισθησία στην πεζότητα, απλά ορίστε το σε FALSE.
Ας υποθέσουμε ότι θέλετε να προσδιορίσετε ημερομηνίες όπως 1-Mar-22 ή 01-MAR-2022. Για να ταιριάξετε το dd-mmm-yyyy και d-mmm-yy μορφές, χρησιμοποιούμε την ακόλουθη κανονική έκφραση.
Μοτίβο : \b\d{1,2}-(Jan
Η έκφρασή μας αναζητά μια ομάδα 1 ή 2 ψηφίων, ακολουθούμενη από μια παύλα, ακολουθούμενη από οποιαδήποτε από τις συντομογραφίες του μήνα που χωρίζονται από
Γιατί δεν χρησιμοποιείτε ένα απλούστερο μοτίβο όπως \d{1,2}-[A-Za-z]{3}-\d{2,4}\b; Για να αποφύγετε ψευδώς θετικές αντιστοιχίες όπως 01-ABC-2020.
Εισάγετε το μοτίβο στο Α2 και θα λάβετε τον ακόλουθο τύπο:
=RegExpMatch(A5, $A$2, FALSE)
Regex για την αντιστοίχιση έγκυρων διευθύνσεων email
Όπως είναι γενικά γνωστό, μια διεύθυνση ηλεκτρονικού ταχυδρομείου αποτελείται από 4 μέρη: όνομα χρήστη, σύμβολο @, όνομα τομέα (διακομιστής αλληλογραφίας) και τομέα ανωτάτου επιπέδου (όπως .com, .edu, .org κ.λπ.). Για να ελέγξουμε την εγκυρότητα της διεύθυνσης ηλεκτρονικού ταχυδρομείου, θα πρέπει να αναπαράγουμε την παραπάνω δομή χρησιμοποιώντας κανονικές εκφράσεις.
Μοτίβο : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Για να καταλάβετε καλύτερα τι συμβαίνει εδώ, ας ρίξουμε μια πιο προσεκτική ματιά σε κάθε μέρος:
Σημείωση. Το μοτίβο υποθέτει ότι το όνομα τομέα περιέχει 2 ή περισσότερους αλφαριθμητικούς χαρακτήρες.
Με το αρχικό κείμενο στο Α5 και το σχέδιο στο Α5, ο τύπος παίρνει την εξής μορφή:
=RegExpMatch(A5, $A$2)
Ή θα μπορούσατε να χρησιμοποιήσετε μια απλούστερη κανονική έκφραση για την επικύρωση ηλεκτρονικού ταχυδρομείου είτε με πεζά είτε με κεφαλαία γράμματα:
Μοτίβο : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Αλλά κάντε τον τύπο σας χωρίς ευαισθησία στην πεζότητα:
=RegExpMatch(A5, $A$2, FALSE)
Τύπος του Excel IF με regex αγώνα
Λόγω του γεγονότος ότι οι ενσωματωμένες και οι προσαρμοσμένες συναρτήσεις συμβαδίζουν άψογα, δεν υπάρχει τίποτα που να σας εμποδίζει να τις χρησιμοποιείτε μαζί σε έναν ενιαίο τύπο.
Για να επιστρέψετε ή να υπολογίσετε κάτι αν μια κανονική έκφραση ταιριάζει και κάτι άλλο αν δεν ταιριάζει, ενσωματώστε την προσαρμοσμένη συνάρτηση RegExpMatch στο λογικό κείμενο της IF:
IF(RegExpMatch(...), [value_if_true], [value_if_false])Για παράδειγμα, εάν μια συμβολοσειρά στο A5 περιέχει μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου, μπορείτε να επιστρέψετε "Ναι", διαφορετικά "Όχι".
=IF(RegExpMatch(A5, $A$2,), "Ναι", "Όχι")
Μετρήστε αν η regex ταιριάζει
Επειδή οι εγγενείς συναρτήσεις του Excel δεν υποστηρίζουν κανονικές εκφράσεις, δεν είναι δυνατόν να τοποθετήσετε μια regex απευθείας στη συνάρτηση COUNTIS ή COUNTIFS. Ευτυχώς, μπορείτε να μιμηθείτε αυτή τη λειτουργία χρησιμοποιώντας την προσαρμοσμένη μας συνάρτηση.
Ας υποθέσουμε ότι έχετε χρησιμοποιήσει μια regex για να ταιριάξετε αριθμούς τηλεφώνου και να εξάγετε τα αποτελέσματα στη στήλη Β. Για να μάθετε πόσα κελιά περιέχουν αριθμούς τηλεφώνου, πρέπει απλώς να μετρήσετε τις τιμές TRUE στα B5:B9. Και αυτό μπορεί εύκολα να γίνει χρησιμοποιώντας τον τυπικό τύπο COUNTIF:
=COUNTIF(B5:B9, TRUE)
Δεν θέλετε επιπλέον στήλες στο φύλλο εργασίας σας; Κανένα πρόβλημα. Έχοντας κατά νου ότι η προσαρμοσμένη συνάρτησή μας μπορεί να επεξεργάζεται πολλά κελιά ταυτόχρονα και ότι η SUM του Excel μπορεί να αθροίζει τιμές σε έναν πίνακα, κάντε το εξής:
=SUM(--RegExpMatch(A5:A9, $A$2))
Αντιστοίχιση Regex με την Ultimate Suite
Οι χρήστες της Ultimate Suite μπορούν να αξιοποιήσουν τέσσερις ισχυρές συναρτήσεις Regex χωρίς να προσθέσουν κώδικα VBA στα βιβλία εργασίας τους, καθώς ενσωματώνονται ομαλά στο Excel κατά την εγκατάσταση του πρόσθετου. Οι προσαρμοσμένες συναρτήσεις μας επεξεργάζονται από την τυπική μηχανή .NET RegEx και υποστηρίζουν πλήρως εξοπλισμένες κλασικές κανονικές εκφράσεις.
Πώς να χρησιμοποιήσετε την προσαρμοσμένη συνάρτηση RegexMatch
Υποθέτοντας ότι έχετε εγκαταστήσει την τελευταία έκδοση της Ultimate Suite (2021.4 ή νεότερη), μπορείτε να δημιουργήσετε έναν τύπο Regex Match σε δύο απλά βήματα:
Μια στιγμή αργότερα, το AblebitsRegexMatch εισάγεται σε μια νέα στήλη στα δεξιά των δεδομένων σας.
Στο παρακάτω στιγμιότυπο οθόνης, η συνάρτηση ελέγχει αν οι συμβολοσειρές στη στήλη Α περιέχουν 7ψήφιους αριθμούς ή όχι.
Συμβουλές:
Για περισσότερες πληροφορίες, ανατρέξτε στη συνάρτηση AblebitsRegexMatch.
Αυτός είναι ο τρόπος με τον οποίο μπορείτε να κάνετε ταυτοποίηση κανονικών εκφράσεων στο Excel. Σας ευχαριστώ για την ανάγνωση και ανυπομονώ να σας δω στο blog μας την επόμενη εβδομάδα!
Διαθέσιμες λήψεις
Παραδείγματα Excel Regex Match (.xlsm αρχείο)
Ultimate Suite 14 ημερών πλήρως λειτουργική έκδοση (.exe αρχείο)