Βασικά στοιχεία τακτικής έκφρασης σε C ++

Regular Expression Basics C



Εξετάστε την ακόλουθη πρόταση σε εισαγωγικά:

«Εδώ είναι ο άνθρωπός μου».

Αυτή η συμβολοσειρά μπορεί να βρίσκεται μέσα στον υπολογιστή και ο χρήστης μπορεί να θέλει να μάθει αν έχει τη λέξη άνθρωπος. Εάν έχει τη λέξη άντρας, τότε μπορεί να θέλει να αλλάξει τη λέξη άντρας σε γυναίκα. έτσι ώστε η συμβολοσειρά να διαβάζει:







«Εδώ είναι η γυναίκα μου».

Υπάρχουν πολλές άλλες επιθυμίες όπως αυτές από τον χρήστη του υπολογιστή. μερικά είναι πολύπλοκα. Η κανονική έκφραση, συντομευμένη, regex, είναι το αντικείμενο χειρισμού αυτών των ζητημάτων από τον υπολογιστή. Το C ++ συνοδεύεται από μια βιβλιοθήκη που ονομάζεται regex. Έτσι, ένα πρόγραμμα C ++ για τον χειρισμό του regex θα πρέπει να ξεκινά με:



#περιλαμβάνω

#περιλαμβάνω

χρησιμοποιώντας το όνομα χώρου std?

Αυτό το άρθρο εξηγεί τα βασικά βασικής έκφρασης σε C ++.



Περιεχόμενο άρθρου

Βασικές αρχές τακτικής έκφρασης

Regex

Μια συμβολοσειρά όπως το Here is my man. παραπάνω είναι η ακολουθία στόχου ή η συμβολοσειρά στόχου ή απλά, ο στόχος. ο άνθρωπος, που αναζητήθηκε, είναι η κανονική έκφραση, ή απλά, το ρεγκέξ.





Ταίριασμα

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

Απλή αντιστοίχιση

Το παρακάτω πρόγραμμα δείχνει πώς ταιριάζει η λέξη άνθρωπος.



#περιλαμβάνω

#περιλαμβάνω

χρησιμοποιώντας το όνομα χώρου std?

intκύριος()
{

regex reg('άνδρας')?
αν (regex_search(«Εδώ είναι ο άνθρωπός μου».,reg))
κόστος<< 'ταιριάζει' <<endl?
αλλού
κόστος<< 'δεν ταιριάζει' <<endl?

ΕΠΙΣΤΡΟΦΗ 0?
}

Η συνάρτηση regex_search () επιστρέφει true αν υπάρχει αντιστοίχιση και επιστρέφει false αν δεν προκύψει αντιστοίχιση. Εδώ, η συνάρτηση παίρνει δύο ορίσματα: το πρώτο είναι η συμβολοσειρά στόχου και το δεύτερο είναι το αντικείμενο regex. Το ίδιο το regex είναι «άνθρωπος», σε διπλά εισαγωγικά. Η πρώτη πρόταση στη συνάρτηση main () σχηματίζει το αντικείμενο regex. Το Regex είναι ένας τύπος και reg είναι το αντικείμενο regex. Η έξοδος του παραπάνω προγράμματος είναι 'αντιστοιχισμένη', καθώς το 'man' εμφανίζεται στη συμβολοσειρά στόχου. Εάν το 'man' δεν εμφανιζόταν στο στόχο, το regex_search () θα είχε επιστρέψει ως false και η έξοδος δεν θα είχε 'αντιστοιχιστεί'.

Η έξοδος του ακόλουθου κώδικα δεν ταιριάζει:

regex reg('άνδρας')?
αν (regex_search(«Εδώ φτιάχνω».,reg))
κόστος<< 'ταιριάζει' <<endl?
αλλού
κόστος<< 'δεν ταιριάζει' <<endl?

Δεν ταιριάζει επειδή το regex 'man' δεν μπορούσε να βρεθεί σε ολόκληρη τη συμβολοσειρά στόχου, 'Here is my making.'

Πρότυπο

Η κανονική έκφραση, άντρας παραπάνω, είναι πολύ απλή. Τα Regex δεν είναι συνήθως τόσο απλά. Οι κανονικές εκφράσεις έχουν μεταχαρακτήρες. Οι μεταχαρακτήρες είναι χαρακτήρες με ειδικές έννοιες. Ο μεταχαρακτήρας είναι ένας χαρακτήρας για χαρακτήρες. Οι μεταχαρακτήρες regex C ++ είναι:

^$ .* + ; ( ) [ ] { } |

Ένα regex, με ή χωρίς μεταχαρακτήρες, είναι ένα μοτίβο.

Τάξεις χαρακτήρων

Αγκύλες

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

'Η γάτα είναι στο δωμάτιο.'

'Η νυχτερίδα είναι στο δωμάτιο.'

'Ο αρουραίος είναι στο δωμάτιο.'

Το regex, [cbr] at θα ταίριαζε με τη γάτα στον πρώτο στόχο. Θα ταίριαζε με νυχτερίδα στον δεύτερο στόχο. Θα ταιριάζει με τον αρουραίο στον τρίτο στόχο. Αυτό συμβαίνει επειδή, η γάτα ή η νυχτερίδα ή ο αρουραίος ξεκινούν με «c» ή «b» ή «r». Το παρακάτω τμήμα κώδικα το δείχνει:

regex reg('[cbr] στο')?
αν (regex_search('Η γάτα είναι στο δωμάτιο.',reg))
κόστος<< 'ταιριάζει' <<endl?
αν (regex_search('Η νυχτερίδα είναι στο δωμάτιο.',reg))
κόστος<< 'ταιριάζει' <<endl?
αν (regex_search('Ο αρουραίος είναι στο δωμάτιο.',reg))
κόστος<< 'ταιριάζει' <<endl?

Η έξοδος είναι:

ταιριάζει

ταιριάζει

ταιριάζει

Σειρά χαρακτήρων

Η τάξη, [cbr] στο μοτίβο [cbr], θα ταιριάζει με αρκετούς πιθανούς χαρακτήρες στο στόχο. Θα ταιριάζει με το «c» ή το «b» ή το «r» στο στόχο. Εάν ο στόχος δεν έχει κανένα από τα 'c' ή 'b' ή 'r', ακολουθούμενο από το στο, δεν θα υπάρχει αντιστοίχιση.

Ορισμένες δυνατότητες όπως «γ» ή «β» ή «r» υπάρχουν σε ένα εύρος. Το εύρος των ψηφίων, 0 έως 9 έχει 10 δυνατότητες και το μοτίβο για αυτό είναι [0-9]. Το εύρος των πεζών αλφαβήτων, από το a έως το z, έχει 26 δυνατότητες και το μοτίβο για αυτό είναι [a-z]. Το εύρος των κεφαλαίων αλφαβήτων, Α έως Ζ, έχει 26 δυνατότητες και το μοτίβο για αυτό είναι [Α-Ζ]. - δεν είναι επίσημα μεταχαρακτήρας, αλλά μέσα σε αγκύλες, θα έδειχνε ένα εύρος. Έτσι, τα ακόλουθα παράγουν ένα ταίρι:

αν (regex_search('ID6id',ρεγεξ('[0-9]')))

κόστος<< 'ταιριάζει' <<endl?

Σημειώστε πώς έχει κατασκευαστεί το regex ως δεύτερο όρισμα. Η αντιστοίχιση πραγματοποιείται μεταξύ του ψηφίου, 6 στο εύρος, 0 έως 9 και του 6 στο στόχο, ID6id. Ο παραπάνω κωδικός ισοδυναμεί με:

αν (regex_search('ID6id',ρεγεξ('[0123456789] ')))

κόστος<< 'ταιριάζει' <<endl?

Ο ακόλουθος κώδικας παράγει μια αντιστοίχιση:

απανθρακώνωΠ[] = 'ID6iE'?

αν (regex_search(Π,ρεγεξ('[a-z]')))

κόστος<< 'ταιριάζει' <<endl?

Σημειώστε ότι το πρώτο όρισμα εδώ είναι μια μεταβλητή συμβολοσειράς και όχι η κυριολεκτική συμβολοσειρά. Η αντιστοίχιση είναι μεταξύ του «i» στο [a-z] και του «i» στο ID6iE.

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

αν (regex_search(«ID2id είναι ταυτότητα ',ρεγεξ(«ID [0-9] id»)))

κόστος<< 'ταιριάζει' <<endl?

Η αντιστοίχιση είναι μεταξύ αναγνωριστικού ID [0-9] και ID2id. Το υπόλοιπο της συμβολοσειράς στόχου, είναι ένα αναγνωριστικό, δεν ταιριάζει σε αυτήν την κατάσταση.

Όπως χρησιμοποιείται στο θέμα της κανονικής έκφρασης (regexes), η λέξη κλάση σημαίνει στην πραγματικότητα ένα σύνολο. Δηλαδή, ένας από τους χαρακτήρες του συνόλου είναι να ταιριάζει.

Σημείωση: Η παύλα - είναι ένας μεταχαρακτήρας μόνο εντός τετράγωνων παρενθέσεων, υποδεικνύοντας ένα εύρος. Δεν είναι μεταχαρακτήρας στο regex, έξω από τις αγκύλες.

Αρνηση

Μια τάξη που περιλαμβάνει ένα εύρος μπορεί να αρνηθεί. Δηλαδή, κανένας από τους χαρακτήρες του συνόλου (τάξη) δεν πρέπει να ταιριάζει. Αυτό υποδεικνύεται με τον ^ μεταχαρακτήρα στην αρχή του μοτίβου της τάξης, αμέσως μετά την τετράγωνη αγκύλη ανοίγματος. Έτσι, [^0-9] σημαίνει αντιστοίχιση του χαρακτήρα στην κατάλληλη θέση του στόχου, ο οποίος δεν είναι κανένας χαρακτήρας στο εύρος, συμπεριλαμβανομένων των 0 έως 9. Επομένως, ο ακόλουθος κώδικας δεν θα δημιουργήσει αντιστοιχία:

αν (regex_search('0123456789101112',ρεγεξ('[^ 0-9]')))

κόστος<< 'ταιριάζει' <<endl?

αλλού

κόστος<< 'δεν ταιριάζει' <<endl?

Ένα ψηφίο εντός του εύρους 0 έως 9 θα μπορούσε να βρεθεί σε οποιαδήποτε από τις θέσεις συμβολοσειράς στόχου, 0123456789101112, οπότε δεν υπάρχει αντιστοιχία - άρνηση.

Ο ακόλουθος κώδικας παράγει μια αντιστοίχιση:

αν (regex_search('ABCDEFGHIJ',ρεγεξ('[^ 0-9]')))

κόστος<< 'ταιριάζει' <<endl?

Δεν βρέθηκε κανένα ψηφίο στο στόχο, ABCDEFGHIJ ,; έτσι υπάρχει ένα ταίρι.

Το [a-z] είναι ένα εύρος εκτός του [^a-z]. Και έτσι [^a-z] είναι η άρνηση του [a-z].

Το [A-Z] είναι ένα εύρος εκτός [^A-Z]. Και έτσι [^A-Z] είναι η άρνηση του [A-Z].

Υπάρχουν και άλλες διαψεύσεις.

Αντιστοίχιση λευκών χώρων

'' Ή t ή r ή n ή f είναι χαρακτήρας λευκού χώρου. Στον ακόλουθο κώδικα, το regex, n ταιριάζει με ‘ n’ στο στόχο:

αν (regex_search(«Από τη γραμμή ένα. r nΑπό τη γραμμή δύο ».,ρεγεξ(' n')))

κόστος<< 'ταιριάζει' <<endl?

Αντιστοίχιση οποιουδήποτε χαρακτήρα λευκού χώρου

Το μοτίβο ή η κλάση που ταιριάζει με οποιονδήποτε χαρακτήρα λευκού διαστήματος είναι, [ t r n f]. Στον ακόλουθο κώδικα, αντιστοιχεί το ‘’:

αν (regex_search('ένα δύο',ρεγεξ('[ t r nφά] ')))

κόστος<< 'ταιριάζει' <<endl?

Αντιστοίχιση οποιουδήποτε χαρακτήρα μη λευκού χώρου

Το μοτίβο ή η κλάση που ταιριάζει με οποιονδήποτε χαρακτήρα μη λευκού χώρου είναι, [^ t r n f]. Ο ακόλουθος κώδικας δημιουργεί μια αντιστοίχιση επειδή δεν υπάρχει κενός χώρος στο στόχο:

αν (regex_search('1234abcd',ρεγεξ('[^ t r nφά] ')))

κόστος<< 'ταιριάζει' <<endl?

Η περίοδος (.) Στο Μοτίβο

Η περίοδος (.) Στο μοτίβο ταιριάζει με οποιονδήποτε χαρακτήρα, συμπεριλαμβανομένου του ίδιου, εκτός από n, στο στόχο. Μια αντιστοίχιση παράγεται στον ακόλουθο κώδικα:

αν (regex_search('1234abcd',ρεγεξ('.')))

κόστος<< 'ταιριάζει' <<endl?

Δεν υπάρχουν αποτελέσματα αντιστοίχισης στον ακόλουθο κώδικα επειδή ο στόχος είναι n.

αν (regex_search(' n',ρεγεξ('.')))

κόστος<< 'ταιριάζει' <<endl?

αλλού

κόστος<< 'δεν ταιριάζει' <<endl?

Σημείωση: Μέσα σε μια κατηγορία χαρακτήρων με αγκύλες, η περίοδος δεν έχει ιδιαίτερο νόημα.

Αντιστοίχιση Επαναλήψεων

Ένας χαρακτήρας ή μια ομάδα χαρακτήρων μπορεί να εμφανιστούν περισσότερες από μία φορές εντός της συμβολοσειράς στόχου. Ένα μοτίβο μπορεί να ταιριάζει με αυτήν την επανάληψη. Οι μεταχαρακτήρες,?, *, +Και {} χρησιμοποιούνται για να ταιριάζουν με την επανάληψη στο στόχο. Εάν το x είναι ένας χαρακτήρας που ενδιαφέρει τη συμβολοσειρά στόχου, τότε οι μεταχαρακτήρες έχουν τις ακόλουθες έννοιες:

Χ*:σημαίνει ταίριασμα'Χ' 0ή περισσότερες φορές,Εγώ.ΚαιΤο,οποιεσδήποτε φορές

Χ+:σημαίνει ταίριασμα'Χ' 1ή περισσότερες φορές,Εγώ.ΚαιΤο,τουλάχιστον μία φορά

Χ; :σημαίνει ταίριασμα'Χ' 0ή1 χρόνος

Χ{ν,}:σημαίνει ταίριασμα'Χ'τουλάχιστον n ή περισσότερες φορές.Σημείωσητο κόμμα.

Χ{ν} :αγώνας'Χ'ακριβώς n φορές

Χ{ν,Μ}:αγώνας'Χ'τουλάχιστον n φορές,αλλά όχι περισσότερες από μ. φορές.

Αυτοί οι μεταχαρακτήρες ονομάζονται ποσοτικοποιητές.

Εικονογραφήσεις

*

Το * ταιριάζει με τον προηγούμενο χαρακτήρα ή την προηγούμενη ομάδα, μηδέν ή περισσότερες φορές. o* ταιριάζει με το «o» σε σκύλο της συμβολοσειράς στόχου. Ταιριάζει επίσης στο βιβλίο και στην εμφάνιση. Το regex, o* ταιριάζει boooo στο The animal booooed .. Σημείωση: o* ταιριάζει dig, όπου το ‘o’ εμφανίζεται μηδενικός (ή περισσότερο) χρόνος.

+

Το + ταιριάζει με τον προηγούμενο χαρακτήρα ή την προηγούμενη ομάδα, 1 ή περισσότερες φορές. Αντιπαραβάλετε το με μηδέν ή περισσότερες φορές για *. Έτσι το regex, το e+ ταιριάζει με το ‘e’ στο eat, όπου το ‘e’ εμφανίζεται μία φορά. Το e+ ταιριάζει επίσης με το ee στα πρόβατα, όπου το ‘e’ εμφανίζεται περισσότερες από μία φορές. Σημείωση: το e+ δεν θα ταιριάζει με το dig επειδή στο dig, το 'e' δεν εμφανίζεται τουλάχιστον μία φορά.

;

Ο ? ταιριάζει με τον προηγούμενο χαρακτήρα ή την προηγούμενη ομάδα, 0 ή 1 φορά (και όχι περισσότερο). Λοιπόν, ε; τα σπίρτα σκάβουν επειδή το ‘e’ εμφανίζεται στο dig, μηδενικός χρόνος. μι? αντιστοιχεί σε σύνολο επειδή το 'e' εμφανίζεται στο σύνολο, μία φορά. Σημείωση: ε; ταιριάζει ακόμα με πρόβατα? αν και υπάρχουν δύο ‘e’ στα πρόβατα. Υπάρχει μια απόχρωση εδώ - δείτε αργότερα.

{n,}

Αυτό ταιριάζει με τουλάχιστον n διαδοχικές επαναλήψεις προηγούμενου χαρακτήρα ή προηγούμενης ομάδας. Έτσι, το regex, e {2,} ταιριάζει με τα δύο ‘e’ στο στόχο, τα πρόβατα και τα τρία ‘e’ στα πρόβατα -στόχους. Το e {2,} δεν ταιριάζει με το σύνολο, επειδή το σύνολο έχει μόνο ένα «ε».

{n}

Αυτό ταιριάζει ακριβώς με n διαδοχικές επαναλήψεις προηγούμενου χαρακτήρα ή προηγούμενης ομάδας. Έτσι το regex, e {2} ταιριάζει με τα δύο ‘e’ στο στόχο, πρόβατα. Το e {2} δεν ταιριάζει με το σύνολο επειδή το σύνολο έχει μόνο ένα «ε». Λοιπόν, το e {2} ταιριάζει με δύο ‘e’ στο στόχο, sheeep. Υπάρχει μια απόχρωση εδώ - δείτε αργότερα.

{n, m}

Αυτό ταιριάζει με πολλές διαδοχικές επαναλήψεις προηγούμενου χαρακτήρα ή προηγούμενης ομάδας, οπουδήποτε από n έως m, συμπεριλαμβανομένων. Έτσι, το e {1,3} δεν ταιριάζει με τίποτα στο dig, το οποίο δεν έχει ‘e’. Ταιριάζει με το ένα «ε» στο σετ, τα δύο «ε» στα πρόβατα, τα τρία «ε» στα πρόβατα και τρία «ε» στο Sheeeep. Υπάρχει μια απόχρωση στον τελευταίο αγώνα - δείτε αργότερα.

Αντιστοίχιση εναλλαγής

Εξετάστε την ακόλουθη συμβολοσειρά στόχου στον υπολογιστή.

Το αγρόκτημα έχει γουρούνια διαφορετικών μεγεθών.

Ο προγραμματιστής μπορεί να θέλει να μάθει αν αυτός ο στόχος έχει αίγα, κουνέλι ή γουρούνι. Ο κωδικός θα έχει ως εξής:

απανθρακώνωΠ[] = «Το αγρόκτημα έχει γουρούνια διαφορετικών μεγεθών».?

αν (regex_search(Π,ρεγεξ('κατσίκα | κουνέλι | γουρούνι')))

κόστος<< 'ταιριάζει' <<endl?

αλλού

κόστος<< 'δεν ταιριάζει' <<endl?

Ο κώδικας παράγει ένα ταίρι. Σημειώστε τη χρήση του χαρακτήρα εναλλαγής, |. Μπορεί να υπάρχουν δύο, τρεις, τέσσερις και περισσότερες επιλογές. Το C ++ θα προσπαθήσει πρώτα να ταιριάξει με την πρώτη εναλλακτική, την κατσίκα, σε κάθε θέση χαρακτήρων στη συμβολοσειρά -στόχο. Αν δεν τα καταφέρει με την κατσίκα, δοκιμάζει την επόμενη εναλλακτική, το κουνέλι. Αν δεν τα καταφέρει με το κουνέλι, δοκιμάζει την επόμενη εναλλακτική, το γουρούνι. Εάν το γουρούνι αποτύχει, τότε το C ++ μεταβαίνει στην επόμενη θέση του στόχου και ξεκινά ξανά με την πρώτη εναλλακτική.

Στον παραπάνω κώδικα, το γουρούνι ταιριάζει.

Αντιστοίχιση έναρξης ή τέλους

Αρχή


Εάν το ^ βρίσκεται στην αρχή του regex, τότε το αρχικό κείμενο της συμβολοσειράς στόχου μπορεί να αντιστοιχιστεί με το regex. Στον ακόλουθο κώδικα, η αρχή του στόχου είναι abc, η οποία ταιριάζει:

αν (regex_search('abc και def',ρεγεξ('^ abc')))

κόστος<< 'ταιριάζει' <<endl?

Δεν γίνεται αντιστοίχιση στον ακόλουθο κώδικα:

αν (regex_search('Ναι, abc και def',ρεγεξ('^ abc')))

κόστος<< 'ταιριάζει' <<endl?

αλλού

κόστος<< 'δεν ταιριάζει' <<endl?

Εδώ, το abc δεν βρίσκεται στην αρχή του στόχου.

Σημείωση: Ο χαρακτήρας περιγράμματος, '^', είναι ένας μεταχαρακτήρας στην αρχή του regex, που ταιριάζει με την αρχή της συμβολοσειράς στόχου. Εξακολουθεί να είναι ένας μεταχαρακτήρας στην αρχή της τάξης χαρακτήρων, όπου αναιρεί την τάξη.

Τέλος

Εάν το $ βρίσκεται στο τέλος του regex, τότε το κείμενο λήξης της συμβολοσειράς στόχου μπορεί να αντιστοιχιστεί με το regex. Στον ακόλουθο κώδικα, το τέλος του στόχου είναι xyz, το οποίο ταιριάζει:

αν (regex_search('uvw και xyz',ρεγεξ('xyz $')))

κόστος<< 'ταιριάζει' <<endl?

Δεν γίνεται αντιστοίχιση στον ακόλουθο κώδικα:

αν (regex_search('uvw και xyz final',ρεγεξ('xyz $')))

κόστος<< 'ταιριάζει' <<endl?

αλλού

κόστος<< 'δεν ταιριάζει' <<endl?

Εδώ, το xyz δεν βρίσκεται στο τέλος του στόχου.

Ομαδοποίηση

Οι παρενθέσεις μπορούν να χρησιμοποιηθούν για την ομαδοποίηση χαρακτήρων σε ένα μοτίβο. Εξετάστε το ακόλουθο regex:

«συναυλία (πιανίστας)»

Η ομάδα εδώ είναι πιανίστας που περιβάλλεται από τους μεταχαρακτήρες (και). Είναι στην πραγματικότητα μια υποομάδα, ενώ μια συναυλία (πιανίστας) είναι ολόκληρη η ομάδα. Σκέψου τα ακόλουθα:

'Ο (πιανίστας είναι καλός)'

Εδώ, η υποομάδα ή η υποχορδή είναι, ο πιανίστας είναι καλός.

Υπο-συμβολοσειρές με κοινά μέρη

Ένας λογιστής είναι ένα άτομο που φροντίζει τα βιβλία. Φανταστείτε μια βιβλιοθήκη με λογιστή και ράφι. Ας υποθέσουμε ότι μία από τις ακόλουθες συμβολοσειρές στόχου βρίσκεται στον υπολογιστή:

'Η βιβλιοθήκη διαθέτει ράφι βιβλίων που θαυμάζεται.'

'Εδώ είναι ο λογιστής.';

'Ο λογιστής δουλεύει με το ράφι.'

Ας υποθέσουμε ότι το ενδιαφέρον του προγραμματιστή δεν είναι να γνωρίζει ποια από αυτές τις προτάσεις είναι στον υπολογιστή. Ακόμα, το ενδιαφέρον του είναι να μάθει αν υπάρχει ράφι ή λογιστής σε οποιοδήποτε κορδόνι στόχου στον υπολογιστή. Σε αυτή την περίπτωση, το regex του μπορεί να είναι:

'ράφι | λογιστής.'

Χρησιμοποιώντας εναλλαγή.

Παρατηρήστε ότι το βιβλίο, το οποίο είναι κοινό και για τις δύο λέξεις, έχει πληκτρολογηθεί δύο φορές, στις δύο λέξεις στο μοτίβο. Για να αποφύγετε να πληκτρολογήσετε το βιβλίο δύο φορές, το regex θα ήταν καλύτερα γραμμένο ως:

«βιβλίο (ράφι | φύλακας)»

Εδώ, η ομάδα, ράφι | φύλακας Ο εναλλακτικός μεταχαρακτήρας χρησιμοποιείται ακόμα, αλλά όχι για δύο μεγάλες λέξεις. Έχει χρησιμοποιηθεί για τα δύο τελειωτικά μέρη των δύο μεγάλων λέξεων. Το C ++ αντιμετωπίζει μια ομάδα ως οντότητα. Έτσι, η C ++ θα αναζητήσει ράφι ή φύλακα που έρχεται αμέσως μετά το βιβλίο. Η έξοδος του ακόλουθου κώδικα ταιριάζει:

απανθρακώνωΠ[] = 'Η βιβλιοθήκη έχει ένα ράφι βιβλίων που θαυμάζεται.'?

αν (regex_search(Π,ρεγεξ(«βιβλίο (ράφι | φύλακας)»)))

κόστος<< 'ταιριάζει' <<endl?

ράφι και όχι λογιστής έχουν αντιστοιχιστεί.

Το icase και οι πολλαπλές γραμμές regex_constants

icase

Η αντιστοίχιση είναι από προεπιλογή κεφαλαία. Ωστόσο, μπορεί να γίνει αδιάκριτο κατά περίπτωση. Για να το πετύχετε, χρησιμοποιήστε τη σταθερά regex :: icase, όπως στον ακόλουθο κώδικα:

αν (regex_search('Ανατροφοδότηση',ρεγεξ('ταίζω',ρεγεξ::icase)))

κόστος<< 'ταιριάζει' <<endl?

Η έξοδος ταιριάζει. Έτσι, η ανατροφοδότηση με το κεφαλαίο «F» έχει αντιστοιχιστεί με τη ροή με το «f». Το regex :: icase έγινε το δεύτερο όρισμα του regex () κατασκευαστή. Χωρίς αυτό, η δήλωση δεν θα είχε αποτέλεσμα.

Πολυγραμμική

Εξετάστε τον ακόλουθο κώδικα:

απανθρακώνωΠ[] = 'γραμμή 1 nγραμμή 2 nγραμμή 3 '?

αν (regex_search(Π,ρεγεξ('^. * $')))

κόστος<< 'ταιριάζει' <<endl?

αλλού

κόστος<< 'δεν ταιριάζει' <<endl?

Η έξοδος δεν ταιριάζει. Το regex, ^.*$, Ταιριάζει με τη συμβολοσειρά -στόχο από την αρχή έως το τέλος της. .* σημαίνει οποιοδήποτε χαρακτήρα εκτός από n, μηδέν ή περισσότερες φορές. Έτσι, λόγω των χαρακτήρων νέας γραμμής ( n) στο στόχο, δεν υπήρχε αντιστοίχιση.

Ο στόχος είναι μια συμβολοσειρά πολλαπλών γραμμών. Για να ταιριάζει το ‘.’ Με τον χαρακτήρα της νέας γραμμής, πρέπει να γίνει η σταθερή regex :: multiline, το δεύτερο επιχείρημα της κατασκευής regex (). Ο παρακάτω κώδικας το δείχνει αυτό:

απανθρακώνωΠ[] = 'γραμμή 1 nγραμμή 2 nγραμμή 3 '?

αν (regex_search(Π,ρεγεξ('^. * $',ρεγεξ::πολυγραμμο)))

κόστος<< 'ταιριάζει' <<endl?

αλλού

κόστος<< 'δεν ταιριάζει' <<endl?

Αντιστοίχιση ολόκληρης της συμβολοσειράς στόχου

Για να ταιριάξει ολόκληρη η συμβολοσειρά στόχου, η οποία δεν έχει τον χαρακτήρα νέας γραμμής ( n), μπορεί να χρησιμοποιηθεί η συνάρτηση regex_match (). Αυτή η συνάρτηση διαφέρει από την regex_search (). Ο παρακάτω κώδικας το δείχνει αυτό:

απανθρακώνωΠ[] = 'πρώτος δεύτερος τρίτος'?

αν (regex_match(Π,ρεγεξ('.*δεύτερος.*')))

κόστος<< 'ταιριάζει' <<endl?

Υπάρχει ένας αγώνας εδώ. Ωστόσο, σημειώστε ότι το regex ταιριάζει με ολόκληρη τη συμβολοσειρά στόχου και η συμβολοσειρά στόχου δεν έχει κανένα ' n'.

Το αντικείμενο match_results

Η συνάρτηση regex_search () μπορεί να λάβει ένα όρισμα μεταξύ του στόχου και του αντικειμένου regex. Αυτό το όρισμα είναι το αντικείμενο match_results. Ολόκληρη η αντιστοιχισμένη συμβολοσειρά (μέρος) και οι αντιστοιχισμένες συμβολοσειρές μπορούν να γίνουν γνωστές με αυτήν. Αυτό το αντικείμενο είναι ένας ειδικός πίνακας με μεθόδους. Ο τύπος αντικειμένου match_results είναι cmatch (για κυριολεκτικά συμβολοσειρών).

Απόκτηση Αγώνων

Εξετάστε τον ακόλουθο κώδικα:

απανθρακώνωΠ[] = 'Η γυναίκα που έψαχνες!'?

cmatch m?

αν (regex_search(Π,Μ,ρεγεξ('w.m.n')))

κόστος<<Μ[0] <<endl?

Η συμβολοσειρά στόχος έχει τη λέξη γυναίκα. Η έξοδος είναι γυναίκα », που αντιστοιχεί στο regex, w.m.n. Στο δείκτη μηδέν, η ειδική συστοιχία κρατά τη μοναδική αντιστοίχιση, η οποία είναι γυναίκα.

Με τις επιλογές κλάσης, μόνο η πρώτη υπο-συμβολοσειρά που βρίσκεται στον στόχο, αποστέλλεται στον ειδικό πίνακα. Ο παρακάτω κώδικας το δείχνει αυτό:

cmatch m?

αν (regex_search('Ο αρουραίος, η γάτα, η νυχτερίδα!',Μ,ρεγεξ('[bcr] στο')))

κόστος<<Μ[0] <<endl?

κόστος<<Μ[1] <<endl?

κόστος<<Μ[2] <<endl?

Η έξοδος είναι αρουραίος από το μηδενικό δείκτη. m [1] και m [2] είναι κενά.

Με εναλλακτικές λύσεις, μόνο η πρώτη υπο-συμβολοσειρά που βρίσκεται στον στόχο, αποστέλλεται στον ειδικό πίνακα. Ο παρακάτω κώδικας το δείχνει αυτό:

αν (regex_search('Το κουνέλι, η κατσίκα, το γουρούνι!',Μ,ρεγεξ('κατσίκα | κουνέλι | γουρούνι')))

κόστος<<Μ[0] <<endl?

κόστος<<Μ[1] <<endl?

κόστος<<Μ[2] <<endl?

Η έξοδος είναι κουνέλι από το μηδενικό δείκτη. m [1] και m [2] είναι κενά.

Ομαδοποιήσεις

Όταν συμμετέχουν ομάδες, το πλήρες μοτίβο ταιριάζει, μπαίνει στο μηδενικό κελί του ειδικού πίνακα. Η επόμενη υπο-συμβολοσειρά που βρέθηκε μπαίνει στο κελί 1. η υπο-συμβολοσειρά που ακολουθεί, μπαίνει στο κελί 2. και ούτω καθεξής. Ο παρακάτω κώδικας το δείχνει αυτό:

αν (regex_search('Ο καλύτερος βιβλιοπώλης σήμερα!',Μ,ρεγεξ('βιβλίο ((sel) (ler))')))

κόστος<<Μ[0] <<endl?

κόστος<<Μ[1] <<endl?

κόστος<<Μ[2] <<endl?

κόστος<<Μ[3] <<endl?

Η έξοδος είναι:

βιβλιοπώλης

πωλητής

κύτταρο

ανάγνωση

Λάβετε υπόψη ότι η ομάδα (πωλητής) έρχεται πριν από την ομάδα (sel).

Θέση Αγώνα

Η θέση αντιστοίχισης για κάθε υπο-συμβολοσειρά στον πίνακα cmatch μπορεί να είναι γνωστή. Η καταμέτρηση ξεκινά από τον πρώτο χαρακτήρα της συμβολοσειράς στόχου, στη θέση μηδέν. Ο παρακάτω κώδικας το δείχνει αυτό:

cmatch m?

αν (regex_search('Ο καλύτερος βιβλιοπώλης σήμερα!',Μ,ρεγεξ('βιβλίο ((sel) (ler))')))

κόστος<<Μ[0] << '->' <<Μ.θέση(0) <<endl?

κόστος<<Μ[1] << '->' <<Μ.θέση(1) <<endl?

κόστος<<Μ[2] << '->' <<Μ.θέση(2) <<endl?

κόστος<<Μ[3] << '->' <<Μ.θέση(3) <<endl?

Σημειώστε τη χρήση της ιδιότητας θέσης, με τον δείκτη κελιού, ως όρισμα. Η έξοδος είναι:

βιβλιοπώλης->5

πωλητής->9

κύτταρο->9

ανάγνωση->12

Αναζήτηση και αντικατάσταση

Μια νέα λέξη ή φράση μπορεί να αντικαταστήσει το ταίριασμα. Η συνάρτηση regex_replace () χρησιμοποιείται για αυτό. Ωστόσο, αυτή τη φορά, η συμβολοσειρά όπου πραγματοποιείται η αντικατάσταση είναι το αντικείμενο συμβολοσειράς και όχι η κυριολεκτική συμβολοσειρά. Έτσι, η βιβλιοθήκη συμβολοσειρών πρέπει να συμπεριληφθεί στο πρόγραμμα. Απεικόνιση:

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

χρησιμοποιώντας το όνομα χώρου std?

intκύριος()
{
str. str= «Εδώ, έρχεται ο άνθρωπος μου. Πάει ο άντρας σου ».?
string newStr=regex_replace(Π,ρεγεξ('άνδρας'), 'γυναίκα')?
κόστος<<newStr<<endl?

ΕΠΙΣΤΡΟΦΗ 0?
}

Η συνάρτηση regex_replace (), όπως κωδικοποιήθηκε εδώ, αντικαθιστά όλες τις αντιστοιχίσεις. Το πρώτο όρισμα της συνάρτησης είναι ο στόχος, το δεύτερο είναι το αντικείμενο regex και το τρίτο είναι η συμβολοσειρά αντικατάστασης. Η συνάρτηση επιστρέφει μια νέα συμβολοσειρά, η οποία είναι ο στόχος αλλά έχει την αντικατάσταση. Η έξοδος είναι:

Έρχεται η γυναίκα μου. Πάει η γυναίκα σου.

συμπέρασμα

Η κανονική έκφραση χρησιμοποιεί μοτίβα για αντιστοίχιση υποστοιχιών στη συμβολοσειρά ακολουθίας στόχου. Τα μοτίβα έχουν μεταχαρακτήρες. Οι συνήθεις συναρτήσεις που χρησιμοποιούνται για κανονικές εκφράσεις C ++ είναι: regex_search (), regex_match () και regex_replace (). Το regex είναι ένα μοτίβο σε διπλά εισαγωγικά. Ωστόσο, αυτές οι συναρτήσεις λαμβάνουν ως αντικείμενο το αντικείμενο regex και όχι μόνο το regex. Το regex πρέπει να γίνει αντικείμενο regex προτού μπορέσουν να το χρησιμοποιήσουν αυτές οι συναρτήσεις.