C++

Grundlagen zu regulären Ausdrücken in C++

Grundlagen zu regulären Ausdrücken in C++
Betrachten Sie den folgenden Satz in Anführungszeichen:

"Hier ist mein Mann."

Diese Zeichenfolge kann sich im Computer befinden und der Benutzer möchte möglicherweise wissen, ob sie das Wort „Mann“ enthält. Wenn es das Wort Mann enthält, möchte er möglicherweise das Wort „Mann“ in „Frau“ ändern; damit die Zeichenfolge lauten sollte:

„Hier ist meine Frau."

Es gibt viele andere Wünsche wie diese vom Computerbenutzer; manche sind komplex. Regulärer Ausdruck, abgekürzt Regex, ist Gegenstand der Behandlung dieser Probleme durch den Computer. C++ kommt mit einer Bibliothek namens regex. Ein C++-Programm zur Behandlung von Regex sollte also beginnen mit:

#einschließen
#einschließen
Verwenden von Namespace-Std;

Dieser Artikel erklärt die Grundlagen zu regulären Ausdrücken in C++.

Artikelinhalt

  • Grundlagen zu regulären Ausdrücken
  • Muster
  • Charakterklassen
  • Passende Leerzeichen
  • Die Periode (.) im Muster
  • Passende Wiederholungen
  • Passende Alternative
  • Passender Anfang oder Ende
  • Gruppierung
  • Die icase- und mehrzeiligen regex_constants
  • Das gesamte Ziel abgleichen
  • Das match_results-Objekt
  • Position des Spiels
  • Suchen und ersetzen
  • Fazit

Grundlagen zu regulären Ausdrücken

Regex

Eine Zeichenfolge wie „Hier ist mein Mann.” oben ist die Zielsequenz oder Zielzeichenfolge oder einfach Ziel. „man“, nach dem gesucht wurde, ist der reguläre Ausdruck oder einfach regex.

Passende

Übereinstimmung findet statt, wenn das gesuchte Wort oder die gesuchte Wortgruppe gefunden wird. Nach dem Matching kann ein Austausch erfolgen. Nachdem beispielsweise „Mann“ oben steht, kann es durch „Frau“ ersetzt werden.

Einfache Zuordnung

Das folgende Programm zeigt, wie das Wort „Mann“ zugeordnet wird.

#einschließen
#einschließen
Verwenden von Namespace-Std;
int main()

regex reg("Mann");
if (regex_search("Hier ist mein Mann.", reg))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;
0 zurückgeben;

Die Funktion regex_search() gibt true zurück, wenn eine Übereinstimmung vorliegt, und gibt false zurück, wenn keine Übereinstimmung auftritt. Hier nimmt die Funktion zwei Argumente an: Das erste ist die Zielzeichenfolge und das zweite ist das Regex-Objekt. Die Regex selbst ist "Mann", in doppelten Anführungszeichen. Die erste Anweisung in der Funktion main() bildet das Regex-Objekt. Regex ist ein Typ und reg ist das Regex-Objekt. Die Ausgabe des obigen Programms ist "übereinstimmend", da "man" in der Zielzeichenfolge zu sehen ist. Wenn "man" im Ziel nicht zu sehen wäre, hätte regex_search() false zurückgegeben und die Ausgabe wäre "not matched" gewesen.

Die Ausgabe des folgenden Codes ist „not matched“:

regex reg("Mann");
if (regex_search("Hier ist meine Herstellung.", reg))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

Keine Übereinstimmung, da die Regex "man" nicht in der gesamten Zielzeichenfolge gefunden werden konnte, "Here is my making."

Muster

Der reguläre Ausdruck „man“ oben ist sehr einfach. Regexes sind normalerweise nicht so einfach. Reguläre Ausdrücke haben Metazeichen. Metazeichen sind Zeichen mit besonderen Bedeutungen. Ein Metacharakter ist ein Charakter über Charaktere. C++ Regex-Metazeichen sind:

^ $ \ . * + ? ( ) [ ] |

Eine Regex, mit oder ohne Metazeichen, ist ein Muster.

Charakterklassen

Eckige Klammern

Ein Muster kann Zeichen in eckigen Klammern enthalten. Damit würde eine bestimmte Position in der Zielzeichenfolge mit einem der Zeichen der eckigen Klammern übereinstimmen. Betrachten Sie die folgenden Ziele:

"Die Katze ist im Zimmer."
"Die Fledermaus ist im Zimmer."
"Die Ratte ist im Zimmer."

Die Regex [cbr]at würde mit cat im ersten Ziel übereinstimmen. Es würde mit der Fledermaus im zweiten Ziel übereinstimmen. Es würde der Ratte im dritten Ziel entsprechen. Dies liegt daran, dass „Katze“ oder „Fledermaus“ oder „Ratte“ mit „c“ oder „b“ oder „r“ beginnt. Das folgende Codesegment veranschaulicht dies:

regex reg("[cbr]at");
if (regex_search("Die Katze ist im Zimmer.", reg))
cout << "matched" << endl;
if (regex_search("Die Fledermaus ist im Raum.", reg))
cout << "matched" << endl;
if (regex_search("Die Ratte ist im Raum.", reg))
cout << "matched" << endl;

Die Ausgabe ist:

abgestimmt
abgestimmt
abgestimmt

Zeichenbereich

Die Klasse [cbr] im Muster [cbr] würde mit mehreren möglichen Zeichen im Ziel übereinstimmen. Es würde mit 'c' oder 'b' oder 'r' im Ziel übereinstimmen. Wenn das Ziel kein 'c' oder 'b' oder 'r' enthält, gefolgt von "at", gibt es keine Übereinstimmung.

Einige Möglichkeiten wie 'c' oder 'b' oder 'r' existieren in einem Bereich. Der Ziffernbereich 0 bis 9 hat 10 Möglichkeiten, und das Muster dafür ist [0-9]. Der Bereich der Kleinbuchstaben von a bis z hat 26 Möglichkeiten, und das Muster dafür ist [a-z]. Der Bereich der Großbuchstaben von A bis Z hat 26 Möglichkeiten, und das Muster dafür ist [A-Z]. - ist offiziell kein Metazeichen, aber in eckigen Klammern würde es einen Bereich anzeigen. Folgendes ergibt also eine Übereinstimmung:

if (regex_search("ID6id", regex("[0-9]")))
cout << "matched" << endl;

Beachten Sie, wie die Regex als zweites Argument konstruiert wurde. Die Übereinstimmung findet zwischen der Ziffer 6 im Bereich 0 bis 9 und der 6 im Ziel „ID6id“ statt. Der obige Code entspricht:

if (regex_search("ID6id", regex("[0123456789]")))
cout << "matched" << endl;

Der folgende Code erzeugt eine Übereinstimmung:

char str[] = "ID6iE";
if (regex_search(str, regex("[a-z]")))
cout << "matched" << endl;

Beachten Sie, dass das erste Argument hier eine String-Variable ist und nicht das String-Literal. Die Übereinstimmung liegt zwischen 'i' in [a-z] und 'i' in "ID6iE".

Vergessen Sie nicht, dass ein Bereich eine Klasse ist. Im Muster kann sich rechts oder links des Bereichs Text befinden. Der folgende Code erzeugt eine Übereinstimmung:

if (regex_search("ID2id ist eine ID", regex("ID[0-9]id")))
cout << "matched" << endl;

Die Übereinstimmung liegt zwischen "ID[0-9]id" und "ID2id". Der Rest der Zielzeichenfolge „ist eine ID“ stimmt in dieser Situation nicht überein.

Wie im Betreff regulärer Ausdrücke (regexes) verwendet, bedeutet das Wort Klasse eigentlich eine Menge. Das heißt, einer der Charaktere im Set muss übereinstimmen.

Hinweis: Der Bindestrich - ist ein Metazeichen, das nur in eckigen Klammern steht und einen Bereich angibt. Es ist kein Metazeichen in der Regex, außerhalb der eckigen Klammern.

Negation

Eine Klasse mit einem Bereich kann negiert werden. Das heißt, keines der Zeichen in der Menge (Klasse) sollte übereinstimmen. Dies wird mit dem ^-Metazeichen am Anfang des Klassenmusters direkt nach der öffnenden eckigen Klammer angezeigt. [^0-9] bedeutet also, dass das Zeichen an der entsprechenden Position im Ziel übereinstimmt, das kein Zeichen im Bereich von 0 bis einschließlich 9 ist. Der folgende Code erzeugt also keine Übereinstimmung:

if (regex_search("0123456789101112", regex("[^0-9]")))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

Eine Ziffer im Bereich von 0 bis 9 kann an jeder der Zielzeichenfolgenpositionen gefunden werden, „0123456789101112“; also gibt es keine Übereinstimmung - Negation.

Der folgende Code erzeugt eine Übereinstimmung:

if (regex_search("ABCDEFGHIJ", regex("[^0-9]")))
cout << "matched" << endl;

Im Ziel „ABCDEFGHIJ“ konnte keine Ziffer gefunden werden; es gibt also eine Übereinstimmung.

[a-z] ist ein Bereich außerhalb von [^a-z]. Und so ist [^a-z] die Negation von [a-z].

[A-Z] ist ein Bereich außerhalb von [^A-Z]. Und so ist [^A-Z] die Negation von [A-Z].

Andere Verneinungen existieren.

Passende Leerzeichen

"oder \t oder \r oder \n oder \f ist ein Leerzeichen. Im folgenden Code stimmt die Regex „\n“ mit „\n“ im Ziel überein:

if (regex_search("Von Zeile eins.\r\nVon Zeile zwei.", regex("\n")))
cout << "matched" << endl;

Übereinstimmung mit einem beliebigen Whitespace-Zeichen

Das Muster oder die Klasse, die einem Leerzeichen entspricht, ist [ \t\r\n\f]. Im folgenden Code wird "entspricht:

if (regex_search("eins zwei", regex("[ \t\r\n\f]")))
cout << "matched" << endl;

Übereinstimmung mit einem Nicht-Leerzeichen-Zeichen

Das Muster oder die Klasse, die einem Nicht-Leerraumzeichen entspricht, ist [^ \t\r\n\f]. Der folgende Code erzeugt eine Übereinstimmung, da das Ziel kein Leerzeichen enthält:

if (regex_search("1234abcd", regex("[^ \t\r\n\f]")))
cout << "matched" << endl;

Die Periode (.) im Muster

Die Periode (.) im Muster stimmt mit jedem Zeichen überein, einschließlich sich selbst, außer \n, im Ziel. Eine Übereinstimmung wird im folgenden Code erzeugt:

if (regex_search("1234abcd", regex(".")))
cout << "matched" << endl;

Keine übereinstimmenden Ergebnisse im folgenden Code, da das Ziel "\n" ist.

if (regex_search("\n", regex(".")))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

Hinweis: Innerhalb einer Zeichenklasse mit eckigen Klammern hat der Punkt keine besondere Bedeutung.

Passende Wiederholungen

Ein Zeichen oder eine Zeichengruppe kann innerhalb des Zielstrings mehrfach vorkommen. Ein Muster kann dieser Wiederholung entsprechen. Die Metazeichen, ?, *, + und werden verwendet, um die Wiederholung im Ziel abzugleichen. Wenn x ein interessierendes Zeichen in der Zielzeichenfolge ist, haben die Metazeichen die folgenden Bedeutungen:

x*: bedeutet, dass 'x' 0 oder öfter übereinstimmt, i.e., beliebig oft
x+: bedeutet, dass 'x' 1 oder mehrmals übereinstimmt, i.e., wenigstens einmal
x? : bedeutet, dass 'x' 0 oder 1 Mal übereinstimmt
xn,: bedeutet, dass 'x' mindestens n oder öfter gefunden wird match. Beachten Sie das Komma.
xn : treffe 'x' genau n-mal
xn,m: treffe 'x' mindestens n-mal, aber nicht mehr als m-mal.

Diese Metazeichen werden Quantoren genannt.

Illustrationen

*

Das * entspricht dem vorangehenden Zeichen oder der vorangehenden Gruppe, null oder mehrmals. „o*“ stimmt mit „o“ in „Hund“ der Zielzeichenfolge überein. Es stimmt auch mit "oo" in "book" und "looking" überein. Die Regex "o*" entspricht "boooo" in "The animal booooed".”. Hinweis: „o*“ entspricht „dig“, wobei „o“ null (oder öfter) Mal vorkommt.

+

Das + entspricht ein- oder mehrmals dem vorhergehenden Zeichen oder der vorhergehenden Gruppe. Vergleichen Sie es mit null oder öfter für *. Die Regex „e+“ stimmt also mit „e“ in „eat“ überein, wobei „e“ einmal vorkommt. „e+“ stimmt auch mit „ee“ in „Schaf“ überein, wobei „e“ mehr als einmal vorkommt. Hinweis: „e+“ stimmt nicht mit „dig“ überein, da in „dig“ „e“ nicht mindestens einmal vorkommt.

?

Das ? stimmt mit dem vorhergehenden Zeichen oder der vorhergehenden Gruppe überein, 0 oder 1 Mal (und nicht mehr). Also, „e?” stimmt mit „dig“ überein, weil „e“ in „dig“ vorkommt, Nullzeit. „e?” stimmt mit „set“ überein, weil 'e' in „set“ einmal vorkommt. Hinweis: „e?” passt immer noch zu “Schaf”; obwohl es zwei 'e's in "Schafe" gibt. Hier gibt es eine Nuance - siehe später.

n,

Dies entspricht mindestens n aufeinanderfolgenden Wiederholungen eines vorangehenden Zeichens oder einer vorangehenden Gruppe. Die Regex „e2,“ stimmt also mit den zwei „e“ im Ziel „sheep“ und den drei „e“ im Ziel „sheeep“ überein. „e2,“ stimmt nicht mit „set“ überein, da „set“ nur ein „e“ hat.

n

Dies entspricht genau n aufeinanderfolgenden Wiederholungen eines vorangehenden Zeichens oder einer vorangehenden Gruppe. Die Regex „e2“ stimmt also mit den beiden „e“ im Ziel „Schaf“ überein. „e2“ stimmt nicht mit „set“ überein, da „set“ nur ein „e“ hat. Nun, "e2" entspricht zwei 'e's im Ziel "Schaf". Hier gibt es eine Nuance - siehe später.

n, m

Dies entspricht mehreren aufeinanderfolgenden Wiederholungen eines vorangehenden Zeichens oder einer vorangehenden Gruppe von n bis einschließlich m. „e1,3“ stimmt also mit nichts in „dig“ überein, das kein „e“ hat. Es entspricht dem einen „e“ in „set“, den zwei „e“ in „sheep“, den drei „e“ in „sheeep“ und den drei „e“ in „sheeeep“. Beim letzten Spiel gibt es eine Nuance - siehe später.

Passende Alternative

Betrachten Sie die folgende Zielzeichenfolge im Computer.

„Der Hof hat Schweine unterschiedlicher Größe.”

Der Programmierer möchte vielleicht wissen, ob dieses Ziel "Ziege" oder "Kaninchen" oder "Schwein" hat. Der Code wäre wie folgt:

char str[] = "Der Hof hat Schweine unterschiedlicher Größe.";
if (regex_search(str, regex("Ziege|Kaninchen|Schwein")))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

Der Code erzeugt eine Übereinstimmung. Beachten Sie die Verwendung des Wechselzeichens |. Es kann zwei, drei, vier und mehr Optionen geben. C++ versucht zunächst, an jeder Zeichenposition in der Zielzeichenfolge die erste Alternative „Ziege“ zu finden. Gelingt es mit „Ziege“ nicht, versucht es die nächste Alternative „Hase“. Gelingt es mit „Kaninchen“ nicht, versucht es die nächste Alternative „Schwein“. Wenn „Schwein“ fehlschlägt, geht C++ zur nächsten Position im Ziel und beginnt wieder mit der ersten Alternative alternative.

Im obigen Code wird „Schwein“ zugeordnet.

Passender Anfang oder Ende

Anfang


Wenn ^ am Anfang der Regex steht, kann der Anfangstext des Zielstrings mit der Regex übereinstimmen. Im folgenden Code ist der Start des Ziels „abc“, was abgeglichen wird:

if (regex_search("abc und def", regex("^abc")))
cout << "matched" << endl;

Im folgenden Code findet kein Abgleich statt:

if (regex_search("Ja, abc und def", regex("^abc")))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

Hier steht „abc“ nicht am Anfang des Ziels.

Hinweis: Das Zirkumflex-Zeichen '^' ist ein Metazeichen am Anfang der Regex, das mit dem Anfang der Zielzeichenfolge übereinstimmt. Es ist immer noch ein Metazeichen am Anfang der Zeichenklasse, wo es die Klasse negiert.

Ende

Wenn $ am Ende der Regex steht, kann der Endtext des Zielstrings mit der Regex übereinstimmen. Im folgenden Code ist das Ende des Ziels „xyz“, das übereinstimmt:

if (regex_search("uvw und xyz", regex("xyz$")))
cout << "matched" << endl;

Im folgenden Code findet kein Abgleich statt:

if (regex_search("uvw und xyz final", regex("xyz$")))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

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 Metazeichen ( und ). Es ist eigentlich eine Untergruppe, während „ein Konzert (Pianist)“ die ganze Gruppe ist. Folgendes berücksichtigen:

"Der (Pianist ist gut)"

Hier ist die Untergruppe oder Teilzeichenfolge „Pianist ist gut“.

Teilsaiten 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, eine der folgenden Zielzeichenfolgen befindet sich im Computer:

"Die Bibliothek hat ein Bücherregal, das bewundert wird.";
"Hier ist der Buchhalter.";
"Der Buchhalter arbeitet mit dem Bücherregal.";

Angenommen, der Programmierer interessiert sich nicht dafür, welcher dieser Sätze im Computer ist. Dennoch ist sein Interesse zu wissen, ob „bookshelf“ oder „bookkeeper“ in der Zielzeichenfolge im Computer vorhanden ist. In diesem Fall kann seine Regex sein:

"Bücherregal|Buchhalter."

Wechsel verwenden.

Beachten Sie, dass „Buch“, das beiden Wörtern gemeinsam ist, zweimal in den beiden Wörtern im Muster eingegeben wurde. Um die doppelte Eingabe von „book“ zu vermeiden, sollte die Regex besser so geschrieben werden:

"Buch(Regal|Aufbewahrer)"

Hier die Gruppe „shelf|keeper“ Das Alternation-Metazeichen wurde noch verwendet, aber nicht für zwei lange Wörter. Es wurde für die beiden Endteile der beiden langen Wörter verwendet. C++ behandelt eine Gruppe als eine Entität. C++ sucht also nach „shelf“ oder „keeper“, die direkt nach „book“ kommen. Die Ausgabe des folgenden Codes ist „matched“:

char str[] = "Die Bibliothek hat ein bewundertes Bücherregal.";
if (regex_search(str, regex("book(shelf|keeper)")))
cout << "matched" << endl;

„Bücherregal“ und nicht „Buchhalter“ wurden abgeglichen.

Die icase- und mehrzeiligen regex_constants

icase

Beim Abgleich wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Es kann jedoch die Groß-/Kleinschreibung beachtet werden. Verwenden Sie dazu die regex::icase-Konstante wie im folgenden Code:

if (regex_search("Feedback", regex("feed", regex::icase)))
cout << "matched" << endl;

Die Ausgabe ist „angepasst“. „Feedback“ mit Großbuchstaben „F“ wurde also durch „Feed“ mit Kleinbuchstaben „f“ abgeglichen. „regex::icase“ wurde zum zweiten Argument des regex()-Konstruktors. Ohne dies würde die Anweisung keine Übereinstimmung ergeben.

Mehrzeilig

Betrachten Sie den folgenden Code:

char str[] = "Zeile 1\nZeile 2\nZeile 3";
if (regex_search(str, regex("^.*$")))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

Die Ausgabe ist „nicht abgestimmt“. Die Regex „^.*$“, stimmt mit der Zielzeichenfolge vom Anfang bis zum Ende überein. “.*” bedeutet jedes Zeichen außer \n, null oder mehrmals. Aufgrund der Zeilenumbrüche (\n) im Ziel gab es keine Übereinstimmung.

Das Ziel ist ein mehrzeiliger String. Damit '.' passend zum Newline-Zeichen muss die Konstante „regex::multiline“ gesetzt werden, das zweite Argument der regex()-Konstruktion. Der folgende Code veranschaulicht dies:

char str[] = "Zeile 1\nZeile 2\nZeile 3";
if (regex_search(str, regex("^.*$", regex::multiline)))
cout << "matched" << endl;
sonst
cout << "not matched" << endl;

Übereinstimmung mit der gesamten Zielzeichenfolge

Um den gesamten Zielstring abzugleichen, der kein Zeilenumbruchzeichen (\n) enthält, kann die Funktion regex_match() verwendet werden. Diese Funktion unterscheidet sich von regex_search(). Der folgende Code veranschaulicht dies:

char str[] = "erstes zweites Drittel";
if (regex_match(str, regex(".*zweite.*")))
cout << "matched" << endl;

Hier gibt es ein Spiel. Beachten Sie jedoch, dass die Regex mit der gesamten Zielzeichenfolge übereinstimmt und die Zielzeichenfolge keine '\n' enthält.

Das match_results-Objekt

Die Funktion regex_search() kann ein Argument zwischen dem Ziel und dem Regex-Objekt annehmen. Dieses Argument ist das match_results-Objekt. Die gesamte übereinstimmende (Teil-)Zeichenfolge und die übereinstimmenden Teilzeichenfolgen können damit erkannt werden. Dieses Objekt ist ein spezielles Array mit Methoden. Der Objekttyp match_results ist cmatch (für String-Literale).

Übereinstimmungen erhalten

Betrachten Sie den folgenden Code:

char str[] = "Die gesuchte Frau you!";
cmatch m;
if (regex_search(str, m, regex("w.ich.n")))
cout << m[0] << endl;

Die Zielzeichenfolge enthält das Wort „Frau“. Die Ausgabe ist „woman“, was der Regex entspricht, „w.ich.n“. Bei Index Null enthält das spezielle Array die einzige Übereinstimmung, die „Frau“ ist.

Bei Klassenoptionen wird nur der erste im Ziel gefundene Teilstring an das spezielle Array gesendet. Der folgende Code veranschaulicht dies:

cmatch m;
if (regex_search("Die Ratte, die Katze, die Fledermaus!", m, regex("[bcr]at")))
cout << m[0] << endl;
cout << m[1] << endl;
cout << m[2] << endl;

Die Ausgabe ist „Ratte“ von Index Null. m[1] und m[2] sind leer.

Bei Alternativen wird nur der erste im Ziel gefundene Teilstring an das spezielle Array gesendet. Der folgende Code veranschaulicht dies:

if (regex_search("Der Hase, die Ziege, das Schwein!", m, regex("Ziege|Kaninchen|Schwein")))
cout << m[0] << endl;
cout << m[1] << endl;
cout << m[2] << endl;

Die Ausgabe ist „Kaninchen“ von Index Null. m[1] und m[2] sind leer.

Gruppierungen

Wenn Gruppen beteiligt sind, geht das vollständige übereinstimmende Muster in die Zelle Null des speziellen Arrays. Die nächste gefundene Teilzeichenfolge geht in Zelle 1; der folgende Teilstring geht in Zelle 2; und so weiter. Der folgende Code veranschaulicht dies:

if (regex_search("Bester Buchhändler heute!", m, regex("book((sel)(ler))")))
cout << m[0] << endl;
cout << m[1] << endl;
cout << m[2] << endl;
cout << m[3] << endl;

Die Ausgabe ist:

Buchhändler
Verkäufer
sel
ler

Beachten Sie, dass die Gruppe (Verkäufer) vor der Gruppe (Sel) steht.

Position des Spiels

Die Position der Übereinstimmung für jede Teilzeichenfolge im cmatch-Array kann bekannt sein. Die Zählung beginnt mit dem ersten Zeichen der Zielzeichenfolge an der Position Null. Der folgende Code veranschaulicht dies:

cmatch m;
if (regex_search("Bester Buchhändler heute!", m, regex("book((sel)(ler))")))
cout << m[0] << "->" << m.position(0) << endl;
cout << m[1] << "->" << m.position(1) << endl;
cout << m[2] << "->" << m.position(2) << endl;
cout << m[3] << "->" << m.position(3) << endl;

Beachten Sie die Verwendung der Positionseigenschaft mit dem Zellindex als Argument. Die Ausgabe ist:

Buchhändler->5
Verkäufer->9
sel->9
ler->12

Suchen und ersetzen

Ein neues Wort oder eine neue Wortgruppe kann die Übereinstimmung ersetzen. Dazu wird die Funktion regex_replace() verwendet. Diesmal ist die Zeichenfolge, in der die Ersetzung erfolgt, jedoch das Zeichenfolgenobjekt, nicht das Zeichenfolgenliteral. Die Stringbibliothek muss also im Programm enthalten sein. Illustration:

#einschließen
#einschließen
#einschließen
Verwenden von Namespace-Std;
int main()

string str = "Hier kommt mein Mann. Da geht dein Mann.";
string newStr = regex_replace(str, regex("Mann"), "Frau");
cout << newStr << endl;
0 zurückgeben;

Die hier codierte Funktion regex_replace() ersetzt alle Übereinstimmungen. Das erste Argument der Funktion ist das Ziel, das zweite das Regex-Objekt und das dritte die Ersatzzeichenfolge. Die Funktion gibt einen neuen String zurück, der das Ziel ist, aber den Ersatz hat. Die Ausgabe ist:

„Hier kommt meine Frau. Da geht deine Frau.”

Fazit

Der reguläre Ausdruck verwendet Muster, um Teilzeichenfolgen in der Zielsequenzzeichenfolge abzugleichen. Muster haben Metazeichen. Häufig verwendete Funktionen für reguläre Ausdrücke in C++ sind: regex_search(), regex_match() und regex_replace(). Eine Regex ist ein Muster in doppelten Anführungszeichen. Diese Funktionen nehmen jedoch das Regex-Objekt als Argument und nicht nur das Regex. Die Regex muss in ein Regex-Objekt umgewandelt werden, bevor diese Funktionen sie verwenden können.

Emulieren Sie Mausklicks, indem Sie den Mauszeiger mit der klicklosen Maus in Windows 10 bewegen
Die Verwendung einer Maus oder Tastatur in der falschen Haltung bei übermäßiger Nutzung kann zu vielen gesundheitlichen Problemen führen, einschließli...
Fügen Sie mit diesen kostenlosen Tools Mausgesten zu Windows 10 hinzu
In den letzten Jahren haben sich Computer und Betriebssysteme stark weiterentwickelt. Es gab eine Zeit, in der Benutzer Befehle verwenden mussten, um ...
Steuern und verwalten Sie Mausbewegungen zwischen mehreren Monitoren in Windows 10
Dual-Display-Maus-Manager lässt Sie die Mausbewegung zwischen mehreren Monitoren steuern und konfigurieren, indem Sie ihre Bewegungen in der Nähe der ...