Reguläre Ausdrücke in C

Muhammad Zeeshan 12 Oktober 2023
  1. Reguläre Ausdrücke in C
  2. Erstellen Sie einen regulären Ausdruck mit der Methode regcomp() in C
  3. Vergleich von Zeichenketten mit einem kompilierten regulären Ausdruck mit der Methode regexec() in C
Reguläre Ausdrücke in C

Reguläre Ausdrücke in C werden zusammen mit einem Beispiel das Diskussionsthema in diesem Artikel sein.

Reguläre Ausdrücke in C

Reguläre Ausdrücke, die aus einer Zeichenkette bestehen, können verwendet werden, um Suchmuster zu entdecken. String-Matching und andere ähnliche Anwendungen machen davon ausgiebigen Gebrauch.

Sie sind ein standardisierter Ansatz zum Abgleichen von Mustersequenzen mit Zeichenfolgen. C, C++, Java und viele andere wichtige Programmiersprachen verwenden es.

Nachdem wir etwas über reguläre Ausdrücke gelernt haben, schauen wir uns einige POSIX-spezifische Bibliotheksmuster an.

  • Die in Klammern eingeschlossenen Buchstaben oder Zahlen finden Sie ganz einfach mit [].
  • [:number:] kann verwendet werden, um eine beliebige Nummer zu finden.
  • [:word:] kann nach Buchstaben, Ziffern und Unterstrichen suchen.
  • [:lower:] wird verwendet, um die Kleinbuchstaben des Alphabets zu finden.

Erstellen Sie einen regulären Ausdruck mit der Methode regcomp() in C

Die Regcomp()-Methode für reguläre Ausdrücke wird zum Kompilieren oder Erstellen von regulären Ausdrücken verwendet. Es erfordert die Regex, den Ausdruck und das Flag.

Der Ausdruck ist ein String-Typ, Regex ist ein Verweis auf einen Speicherbereich, in dem der Ausdruck abgeglichen und gespeichert wird, und das Flag wird verwendet, um die Art der Kompilierung zu identifizieren.

Es gibt den Wert 0 zurück, wenn die Kompilierung ohne Fehler abgeschlossen wurde. Und es wird Fehlercode ausgegeben, wenn der Ausdruck nicht erfolgreich kompiliert werden kann.

Syntax:

regcomp(&regex, expression, flag)

Beispiel:

  • Erstellen Sie eine Variable vom Typ Regex und geben Sie ihr einen Namen, wie wir es getan haben r1.
    regex_t r1;
    
  • Jetzt müssen Sie eine Variable erstellen, die das Ergebnis des Regex-Generierungsprozesses enthält, wie Sie unten sehen können:
    int regval;
    
  • Generieren Sie eine Regex, indem Sie die Funktion aufrufen:
    regval = regcomp(&r1, "[:word:]", 0);
    
  • Regular Expression compiled successfully. wird nach dem Kompilierungsprozess angezeigt.
    if (value == 0) {
      printf("Regular Expression compiled successfully.");
    }
    
  • Andernfalls wird eine Ausnahme mit der Meldung An Error Occurred. ausgelöst.
    else {
      printf("An Error Occurred.");
    }
    

Vollständiger Quellcode:

#include <regex.h>
#include <stdio.h>

int main() {
  regex_t r1;
  int regval;
  regval = regcomp(&r1, "[:word:]", 0);
  if (regval == 0) {
    printf("Regular Expression compiled successfully.");
  } else {
    printf("An Error Occurred.");
  }
  return 0;
}

Ausgabe:

Regular Expression compiled successfully.

Vergleich von Zeichenketten mit einem kompilierten regulären Ausdruck mit der Methode regexec() in C

Mit der Funktion regexec() ist es möglich, einen String mit einem Muster zu vergleichen. Es berücksichtigt einige Parameter: Der erste ist ein vorkompiliertes Muster, ein String, der das zu suchende Muster enthält, Informationen über den Ort von Übereinstimmungen und Flags, die eine Änderung im Verhalten von Übereinstimmungen beschreiben.

Syntax:

regexec(&regex, expression, 0, NULL, 0);

Wenn es eine Übereinstimmung gibt, wird der Wert 0 zurückgegeben. Und wenn es keine Übereinstimmung gibt, wird REG NOMATCH zurückgegeben.

Beispiel:

  • Zunächst erstellen wir eine Funktion namens DisplayPattern, die das Ergebnis anzeigt. Wenn der Wert 0 ist, wird Pattern found angezeigt; wenn es nicht gleich 0 ist, wird einfach Pattern not found angezeigt; Andernfalls wird eine Fehlermeldung mit der Meldung An error occurred. angezeigt.
    void DisplayPattern(int val) {
      if (val == 0) {
        printf("Pattern found.\n");
      } else if (val == REG_NOMATCH) {
        printf("Pattern not found.\n");
      } else {
        printf("An error occurred.\n");
      }
    }
    
  • Jetzt erstellen wir die Funktion Main, in der wir eine Variable vom Typ regex_t mit dem Namen r1 erstellen.
    regex_t r1;
    
  • Erstellen Sie drei Variablen für den Rückgabetyp namens data1, data2, data3.
    int data1;
    int data2;
    int data3;
    
  • Erstellen Sie dann eine RegEx und vergleichen Sie das Muster mit dem String in reg.
    data1 = regcomp(&r1, " I am a writing c language", 0);
    data1 = regexec(&r1, "Hi there its me Zeeshan", 0, NULL, 0);
    
  • Fügen Sie wie unten gezeigt ein paar weitere RegEx hinzu und vergleichen Sie das Muster mit der Zeichenfolge in reg.
    data2 = regcomp(&r1, "I am a writing c language", 0);
    data2 = regexec(&r1, " Lets do coding", 0, NULL, 0);
    
    data3 = regcomp(&r1, "My Name is Zeeshan Khan", 0);
    data3 = regexec(&r1, " My Name is Zeeshan Khan", 0, NULL, 0);
    
  • Zeigen Sie zuletzt Muster mit der zuvor erstellten Funktion DisplayPattern an.
    DisplayPattern(data1);
    DisplayPattern(data2);
    DisplayPattern(data3);
    

Vollständiger Quellcode:

#include <regex.h>
#include <stdio.h>

void DisplayPattern(int val) {
  if (val == 0) {
    printf("Pattern found.\n");
  } else if (val == REG_NOMATCH) {
    printf("Pattern not found.\n");
  } else {
    printf("An error occurred.\n");
  }
}

int main() {
  regex_t r1;
  int data1;
  int data2;
  int data3;
  data1 = regcomp(&r1, " I am a writing c language", 0);
  data1 = regexec(&r1, "Hi there its me Zeeshan", 0, NULL, 0);

  data2 = regcomp(&r1, "I am a writing c language", 0);
  data2 = regexec(&r1, " Lets do coding", 0, NULL, 0);

  data3 = regcomp(&r1, "My Name is Zeeshan Khan", 0);
  data3 = regexec(&r1, " My Name is Zeeshan Khan", 0, NULL, 0);

  DisplayPattern(data1);
  DisplayPattern(data2);
  DisplayPattern(data3);
  return 0;
}

Ausgabe:

Pattern not found.
Pattern not found.
Pattern found.
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn