Diese Zeichenfolge kann sich im Computer befinden, und der Benutzer möchte möglicherweise wissen, ob er das Wort "Mann" hat. Wenn es das Wort Mann hat, möchte er vielleicht das Wort „Mann“ in „Frau“ ändern; so dass die Zeichenfolge lesen sollte:
"Hier ist meine Frau."Es gibt viele andere Wünsche wie diese vom Computerbenutzer. Einige sind komplex. Regelmäßiger Ausdruck, abgekürzt, Regex, ist Gegenstand der Behandlung dieser Probleme durch den Computer. C ++ wird mit einer Bibliothek namens Regex geliefert. Ein C ++ - Programm zur Behandlung von Regex sollte also mit:
#enthaltenDieser Artikel erklärt die Grundlagen der regelmäßigen Expression in C++.
Artikelinhalt
Regelmäßige Ausdrucksgrundlagen
Regex
Eine Schnur wie „Hier ist mein Mann.Oben ist die Zielsequenz oder die Zielzeichenfolge oder einfach das Ziel. "Mann", der gesucht wurde, ist der reguläre Ausdruck oder einfach Regex.
Matching
Die Übereinstimmung soll auftreten, wenn das Wort oder die Suchphrase gefunden wird. Nach dem Matching kann ein Ersatz stattfinden. Zum Beispiel kann es nach „Mann“ oben gefunden werden, kann es durch „Frau“ ersetzt werden.
Einfacher Matching
Das folgende Programm zeigt, wie das Wort „Mann“ übereinstimmt.
#enthaltenDie Funktion regex_search () gibt true zurück, wenn ein Übereinstimmung vorliegt und falsch zurückgibt, wenn keine Übereinstimmung auftritt. Hier nimmt die Funktion zwei Argumente an: Die erste ist die Zielzeichenfolge, und die zweite ist das Regex -Objekt. Der Regex selbst ist "Mann", in doppelten Quoten. Die erste Anweisung in der Funktion main () bildet das Regex -Objekt. Regex ist ein Typ und Reg ist das Regex -Objekt. Die Ausgabe des oben genannten Programms ist "Matched", wie in der Zielzeichenfolge "Mann" zu sehen ist. Wenn "Mann" im Ziel nicht gesehen worden wäre, hätte regex_search () falsch zurückgegeben, und die Ausgabe wäre "nicht übereinstimmen" gewesen.
Die Ausgabe des folgenden Codes ist „nicht übereinstimmen“:
Regex Reg ("Mann");Nicht übereinstimmt, weil der Regex -Mann nicht in der gesamten Zielzeichenfolge gefunden werden konnte ", hier ist meine Herstellung."
Muster
Der reguläre Ausdruck „Mann“ oben ist sehr einfach. Regexes sind normalerweise nicht so einfach. Regelmäßige Ausdrücke haben Metacharacoders. Metacharacter sind Charaktere mit besonderen Bedeutungen. Ein Metacharacter ist ein Charakter über Charaktere. C ++ Regex Metacharacter sind:
^ $ \ . * + ? () [] |Ein Regex mit oder ohne Metacharacter ist ein Muster.
Charakterklassen
Eckige Klammern
Ein Muster kann Zeichen in quadratischen Klammern haben. Damit würde eine bestimmte Position in der Zielzeichenfolge einen der Charaktere der Quadratklammern übereinstimmen. Betrachten Sie die folgenden Ziele:
"Die Katze ist im Raum."Der Regex [CBR] bei würde CAT im ersten Ziel übereinstimmen. Es würde Fledermaus im zweiten Ziel entsprechen. Es würde mit Ratten im dritten Ziel übereinstimmen. Dies liegt daran. Das folgende Codesegment zeigt dies:
regex reg ("[cbr] at");Die Ausgabe ist:
angepasstCharaktere
Die Klasse [CBR] im Muster [CBR] würde mehrere mögliche Zeichen im Ziel übereinstimmen. Es würde mit 'C' oder 'B' oder 'R' im Ziel übereinstimmen. Wenn das Ziel keine von 'C' oder 'B' oder 'R' hat, gefolgt von „AT“, würde es kein Übereinstimmung geben.
Einige Möglichkeiten wie 'C' oder 'B' oder 'R' existieren in einem Bereich. Der Ziffernbereich von 0 bis 9 hat 10 Möglichkeiten, und das Muster dafür ist [0-9]. Der Bereich der Kleinbuchstaben-Alphabete, A bis Z, hat 26 Möglichkeiten, und das Muster dafür ist [a-z]. Der Bereich der Großbuchstaben, A bis Z, hat 26 Möglichkeiten, und das Muster dafür ist [a-z]. - ist offiziell kein Metacharakter, aber in quadratischen Klammern würde es eine Reichweite anzeigen. Das Folgende erzeugt also ein Match:
if (regex_search ("id6id", regex ("[0-9]")))Beachten Sie, wie der Regex als zweites Argument konstruiert wurde. Die Übereinstimmung tritt zwischen der Ziffer, 6 im Bereich von 0 bis 9 und 6 im Ziel „ID6ID“ auf. Der obige Code entspricht:
if (regex_search ("id6id", regex ("[0123456789]")))Der folgende Code erzeugt eine Übereinstimmung:
char str [] = "id6ie";Beachten Sie, dass das erste Argument hier eine String -Variable ist und nicht die String -Literal. Das Match ist zwischen 'I' in [a-z] und 'i' in "id6ie".
Vergessen Sie nicht, dass eine Reichweite eine Klasse ist. Rechts am Bereich oder links neben dem Bereich des Musters kann es Text geben. Der folgende Code erzeugt eine Übereinstimmung:
if (regex_search ("ID2IDPOST-95222 -__ DDELINK__294_3116034780"> ist eine ID ", Regex (" ID [0-9] ID ")))Die Übereinstimmung ist zwischen "ID [0-9] ID" und "ID2ID". Der Rest der Zielzeichenfolge, "ist eine ID", ist in dieser Situation nicht übereinstimmt.
Wie im regulären Expression -Subjekt (Regexes) verwendet, bedeutet die Wortklasse tatsächlich einen Satz. Das heißt, einer der Zeichen im Set ist mithalten.
HINWEIS: Der Bindestrich - ist nur in quadratischen Klammern ein Metacharakter, der einen Bereich anzeigt. Es ist kein Metacharakter in der Regex außerhalb der Quadratklammern.
Negation
Eine Klasse mit einem Bereich kann negiert werden. Das heißt, nicht der Zeichen im Set (Klasse) sollten übereinstimmen. Dies ist mit dem Metacharacter zu Beginn des Klassenmuster. [^0-9] bedeutet also, dass das Zeichen an der entsprechenden Position im Ziel angepasst wird, was kein Zeichen im Bereich von 0 bis 9 inklusive ist. Der folgende Code erzeugt also keine Übereinstimmung:
if (regex_search ("012345678910112", regex ("[^0-9]")))Eine Ziffer innerhalb des Bereichs von 0 bis 9 konnte in einer der Zielzeichenfolge "0123456789101112" gefunden werden; Es gibt also keine Übereinstimmung - Negation.
Der folgende Code erzeugt eine Übereinstimmung:
if (regex_search ("abcdefghij", regex ("[^0-9]")))Es konnte keine Ziffer im Ziel „Abcdefghij“ gefunden werden; Es gibt also ein Match.
[a-z] ist ein Bereich außerhalb [^a-z]. Und so ist [^a-z] die Negation von [a-z].
[A-z] ist ein Bereich außerhalb [^a-z]. Und so ist [^a-z] die Negation von [a-z].
Andere Negationen existieren.
Passende Weißespace
"oder \ t oder \ r oder \ n oder \ f ist ein Whitespace -Zeichen. Im folgenden Code stimmt der Regex, „\ n“, '\ n' im Ziel überein:
if (regex_search ("von Zeile 1.\ r \ nof Zeile zwei.", regex (" \ n ")))Übereinstimmung mit einem Whitespace -Charakter
Das Muster oder die Klasse, die zu einem beliebigen White -Space -Zeichen entspricht, ist [\ t \ r \ n \ f]. Im folgenden Code ist "übereinstimmt:
if (regex_search ("eins zwei", regex ("[\ t \ r \ n \ f]"))))Übereinstimmung mit einem Nicht-Whitespace-Charakter
Das Muster oder die Klasse, die zu einem nicht weißen Raumzeichen entspricht, ist [^ \ t \ r \ n \ f]. Der folgende Code erzeugt eine Übereinstimmung, da das Ziel kein Weißespace enthält:
if (regex_search ("1234abcd", regex ("[^ \ t \ r \ n \ f]"))))Die Periode (.) im Muster
Die Periode (.) im Muster entspricht jedem Zeichen, einschließlich sich selbst, außer \ n, im Ziel. Im folgenden Code wird ein Match erstellt:
if (regex_search ("1234abcd", regex (".")))Keine Übereinstimmungsergebnisse im folgenden Code, da das Ziel "\ n" ist.
if (regex_search ("\ n", regex (".")))Hinweis: In einer Charakterklasse mit quadratischen Klammern hat die Periode keine besondere Bedeutung.
Passende Wiederholungen
Ein Zeichen oder eine Gruppe von Zeichen kann innerhalb der Zielzeichenfolge mehr als einmal auftreten. Ein Muster kann mit dieser Wiederholung übereinstimmen. Die Metacharacter, ?, *, +und werden verwendet, um die Wiederholung im Ziel zu entsprechen. Wenn x ein Zeichen von Interesse an der Zielzeichenfolge ist, haben die Metacharacter die folgenden Bedeutungen:
x*: bedeutet Match 'x' 0 oder mehrmals, ich.e., beliebig viele MaleDiese Metacharacter werden als Quantifizierer bezeichnet.
Illustrationen
*
Der * entspricht dem vorhergehenden Charakter oder der vorhergehenden Gruppe, Null oder mehrmals. "O*" passt zu 'O' in "Hund" der Zielstring. Es passt auch zu „OO“ in „Buch“ und „Looking“. Der Regex, "O*" entspricht "Boooo" in "The Animal Boooed".”. HINWEIS: "O*" stimmt mit "Dig" überein, wo 'O' null (oder mehr) Zeit auftritt.
+
Der + entspricht dem vorhergehenden Charakter oder der vorhergehenden Gruppe, 1 oder mehrmals. Vergleichen Sie es mit Null oder mehrmals für *. Also entspricht der Regex, „E+“ 'e' in „Eat“, wo 'e' einmal vorkommt. "E+" stimmt auch mit "ee" in "Sheep" überein, wo 'e' mehr als einmal vorkommt. Hinweis: "E+" stimmt nicht mit "Dig" überein, da in "Dig" 'E' nicht mindestens einmal auftritt.
?
Der ? entspricht dem vorhergehenden Charakter oder dem vorhergehenden Gruppen, 0 oder 1 Zeit (und nicht mehr). Also, „e?"Übereinstimmt" Dig ", weil 'e' in" Dig ", Nullzeit, vorkommt. „E?"Übereinstimmung" set ", weil 'e' einmal in" Set ", einmal vorhanden. Hinweis: „E?"Passt immer noch" Schafe "; Obwohl es zwei 'E in "Schaf" gibt. Hier gibt es eine Nuance - siehe später.
N,
Dies entspricht mindestens n aufeinanderfolgende Wiederholungen eines vorhergehenden Charakters oder einer vorhergehenden Gruppe. Also entspricht der Regex, "E 2," den beiden "E" im Ziel, "Schaf" und die drei "E" im Ziel "Sheeep". "E 2," stimmt nicht mit "set" überein, weil "set" nur ein 'e' hat.
N
Dies entspricht genau n aufeinanderfolgenden Wiederholungen eines vorhergehenden Charakters oder einer vorhergehenden Gruppe. Also entspricht der Regex, "E 2" mit den beiden "E's im Ziel", "Schafe". "E 2" stimmt nicht mit "set" überein, weil "set" nur ein 'e' hat ". Nun, "e 2" entspricht zwei "E's im Ziel" Sheeep ". Hier gibt es eine Nuance - siehe später.
n, m
Dies entspricht mehreren aufeinanderfolgenden Wiederholungen eines vorhergehenden Charakters oder einer vorhergehenden Gruppe, überall von n bis m, einschließlich. "E 1,3" entspricht also nichts in "Dig", was kein "e" hat. Es entspricht dem "E" in "Set", den beiden "E's in" Sheep ", den drei" in "Sheeep" und drei "E in" Sheeeep ". Es gibt eine Nuance beim letzten Spiel - später siehe.
Passende Abwechslung
Betrachten Sie die folgende Zielzeichenfolge im Computer.
„Die Farm hat Schweine unterschiedlicher Größen.”
Der Programmierer möchte vielleicht wissen, ob dieses Ziel "Ziege" oder "Kaninchen" oder "Schwein" hat. Der Code wäre wie folgt:
char str [] = "Die Farm hat Schweine unterschiedlicher Größen.";Der Code erzeugt eine Übereinstimmung. Beachten Sie die Verwendung des Wechselzeichens, |. Es können zwei, drei, vier und weitere Optionen sein. C ++ wird zunächst versuchen, die erste Alternative, "Ziege", an jeder Zeichenposition in der Zielzeichenfolge zu erreichen. Wenn es nicht mit "Ziege" gelingt, versucht es die nächste Alternative, "Kaninchen". Wenn es nicht mit „Kaninchen“ erfolgreich ist, versucht es die nächste Alternative, „Schwein“. Wenn „Schwein“ fehlschlägt, wechselt C ++ zur nächsten Position im Ziel und beginnt erneut mit der ersten Alternative.
Im obigen Code wird „Schwein“ übereinstimmt.
Matching Anfang oder Ende
Anfang
Wenn ^ am Anfang des Regex liegt, kann der Anfangstext der Zielzeichenfolge von der Regex übereinstimmen. Im folgenden Code ist der Beginn des Ziels „ABC“, was übereinstimmt:
Im folgenden Code findet keine Übereinstimmung statt:
if (regex_search ("Ja, ABC und Def", regex ("^abc")))Hier steht „ABC“ nicht am Anfang des Ziels.
HINWEIS: Das Circumflex -Zeichen '^' ist ein Metacharakter zu Beginn des Regex, der dem Beginn der Zielzeichenfolge entspricht. Es ist immer noch ein Metacharakter zu Beginn der Charakterklasse, wo es die Klasse negiert.
Ende
Wenn sich $ am Ende des Regex befindet, kann der Endtext der Zielzeichenfolge vom Regex übereinstimmen. Im folgenden Code ist das Ende des Ziels "XYZ", was übereinstimmt:
if (regex_search ("uvw und xyz", regex ("xyz $")))Im folgenden Code findet keine Übereinstimmung statt:
if (regex_search ("uvw und xyz final", regex ("xyz $")))Hier ist „XYZ“ nicht am Ende des Ziels.
Gruppierung
Klammern können verwendet werden, um Zeichen in einem Muster zu gruppieren. Betrachten Sie die folgende Regex:
"Ein Konzert (Pianist)"Die Gruppe hier ist „Pianist“, umgeben von den Metacharactern (und). Es ist eigentlich eine Untergruppe, während „ein Konzert (Pianist)“ die ganze Gruppe ist. Folgendes berücksichtigen:
"Der (Pianist ist gut)" "Hier lautet die Untergruppe oder die Unterstriche „Pianist ist gut“.
Unterstrahlen mit gemeinsamen Teilen
Ein Buchhalter ist eine Person, die sich um Bücher kümmert. Stellen Sie sich eine Bibliothek mit Buchhalter und Bücherregal vor. Angenommen, einer der folgenden Zielzeichenfolgen ist im Computer:
"Die Bibliothek hat ein Bücherregal, das bewundert wird.";Angenommen, das Interesse des Programmierers besteht nicht darin, zu wissen, welcher dieser Sätze im Computer ist. Dennoch ist es sein Interesse zu wissen, ob „Bücherregal“ oder „Buchhalter“ in der Zielzeichenfolge im Computer vorhanden ist. In diesem Fall kann seine Regex:
"Bücherregal | Buchhalter."Verwenden von Wechsel.
Beachten Sie, dass „Buch“, das bei beiden Wörtern gemeinsam ist, in den beiden Wörtern im Muster zweimal tippt wurde. Um das Tippen von „Buch“ zweimal zu vermeiden, wäre der Regex besser geschrieben als:
"Buch (Regal | Keeper)"Hier wurde die Gruppe „Shelf | Keeper“ der Wechsel Metacharacter verwendet, aber nicht für zwei lange Wörter. Es wurde für die beiden endenden Teile der beiden langen Wörter verwendet. C ++ behandelt eine Gruppe als Entität. C ++ sucht also nach "Regal" oder "Keeper", der unmittelbar nach "Buch" kommt. Die Ausgabe des folgenden Codes ist „übereinstimmen“:
char st [] = "Die Bibliothek hat ein Bücherregal, das bewundert wird.";"Bücherregal" und nicht "Buchhalter" wurden abgestimmt.
Die ICAS- und Multiline Regex_Constants
ICASE
Die Übereinstimmung ist standardmäßig fallsempfindlich. Es kann jedoch unempfindlich zu Fall gemacht werden. Um dies zu erreichen, verwenden Sie die Regex :: ICASE -Konstante wie im folgenden Code:
if (regex_search ("Feedback", regex ("feed", regex :: icase))))Die Ausgabe ist "übereinstimmen". "Feedback" mit Großbuchstaben 'F' wurde also durch "Feed" mit Kleinbuchstaben 'F' übereinstimmen. "Regex :: icase" wurde zum zweiten Argument des Regex () -Konstruktors. Ohne das würde die Aussage kein Match erzeugen.
Multiline
Betrachten Sie den folgenden Code:
char str [] = "Zeile 1 \ nline 2 \ nline 3";Die Ausgabe ist "nicht übereinstimmen". Der Regex, “^.*$ “, Entspricht der Zielzeichenfolge von Anfang bis Ende. “.*”Bedeutet ein Zeichen außer \ n, Null oder mehrmals. Aufgrund der Newline -Zeichen (\ n) im Ziel gab es also keine Übereinstimmung.
Das Ziel ist eine Multiline -Zeichenfolge. Damit '.Um dem neuen Charakter zu entsprechen, muss die konstante „Regex :: Multiline“ vorgenommen werden, das zweite Argument der Regex () -Baustunde. Der folgende Code zeigt dies:
char str [] = "Zeile 1 \ nline 2 \ nline 3";Übereinstimmung der gesamten Zielzeichenfolge
Um die gesamte Zielzeichenfolge zu entsprechen, die nicht über das neue Zeilenzeichen (\ n) verfügt, kann die Funktion regex_match () verwendet werden. Diese Funktion unterscheidet sich von regex_search (). Der folgende Code zeigt dies:
char str [] = "Erstes drittes Drittel";Hier gibt es ein Match. Beachten Sie jedoch, dass der Regex mit der gesamten Zielzeichenfolge übereinstimmt und die Zielzeichenfolge keine '\ n' hat.
Das Match_Results -Objekt
Die Funktion regex_search () kann ein Argument zwischen dem Ziel und dem Regex-Objekt aufnehmen. Dieses Argument ist das Objekt match_results. Die gesamte übereinstimmende (Teil-) Zeichenfolge und die übereinstimmenden Unterstriche können damit bekannt sein. Dieses Objekt ist ein spezielles Array mit Methoden. Der Objekttyp von Match_Results ist CMatch (für String -Literale).
Übereinstimmungen erhalten
Betrachten Sie den folgenden Code:
Char st [] = "Die Frau, nach der Sie gesucht haben!";Die Zielzeichenfolge hat das Wort "Frau". Die Ausgabe ist „Frau“, die dem Regex entspricht, „W.M.N". Bei Index Null hält das Special Array das einzige Match, nämlich „Frau“.
Mit Klassenoptionen wird nur die erste im Ziel gefundene Unterstriche an das Special Array gesendet. Der folgende Code zeigt dies:
CMatch M;Der Ausgang ist „Ratte“ aus Index Null. M [1] und M [2] sind leer.
Mit Alternativen wird nur die erste im Ziel gefundene Unterstriche an das Special Array gesendet. Der folgende Code zeigt dies:
if (regex_search ("Das Kaninchen, die Ziege, das Schwein!", m, regex (" Ziege | Kaninchen | Schwein ")))Die Ausgabe ist "Kaninchen" aus Index Null. M [1] und M [2] sind leer.
Gruppierungen
Wenn Gruppen involviert sind, wird das vollständige Muster in die Zelle Null des Spezialarrays gelangt. Die nächste gefundene Unterliege geht in Zelle 1; Die Unterliege folgt in Zelle 2; usw. Der folgende Code zeigt dies:
if (regex_search ("Bester Buchhändler heute!", m, regex (" Buch ((sel) (ler)) ")))Die Ausgabe ist:
BuchhändlerBeachten Sie, dass die Gruppe (Verkäufer) vor der Gruppe (SEL) kommt.
Spielposition
Die Übereinstimmungsposition für jede Unterstring im CMatch-Array kann bekannt sein. Das Zählen beginnt vom ersten Zeichen der Zielzeichenfolge an Position Null. Der folgende Code zeigt dies:
CMatch M;Beachten Sie die Verwendung der Positionseigenschaft mit dem Zellindex als Argument. Die Ausgabe ist:
Buchhändler-> 5Suchen und ersetzen
Ein neues Wort oder eine neue Phrase kann die Übereinstimmung ersetzen. Die Funktion regex_replace () wird dafür verwendet. Diesmal ist jedoch die Zeichenfolge, in der der Ersatz auftritt. Die String -Bibliothek muss also in das Programm aufgenommen werden. Illustration:
#enthaltenDie hier codierte Regex_Replace () -Funktion ersetzt alle Übereinstimmungen. Das erste Argument der Funktion ist das Ziel, das zweite ist das Regex -Objekt und das dritte die Ersatzzeichenfolge. Die Funktion gibt eine neue Zeichenfolge zurück, die das Ziel ist, aber den Ersatz hat. Die Ausgabe ist:
„Hier kommt meine Frau. Da geht deine Frau.”
Abschluss
Der reguläre Ausdruck verwendet Muster, um Substrings in der Zielsequenzzeichenfolge zu übereinstimmen. Muster haben Metacharacter. Häufig verwendete Funktionen für C ++ - reguläre Ausdrücke sind: regex_search (), regex_match () und regex_replace (). Ein Regex ist ein Muster in Doppelquoten. Diese Funktionen nehmen das Regex -Objekt jedoch als Argument und nicht nur als Regex an. Der Regex muss in ein Regex -Objekt gemacht werden, bevor diese Funktionen es verwenden können.