C 語言中的正規表示式

Muhammad Zeeshan 2023年1月30日 2022年7月12日
  1. C 語言中的正規表示式
  2. 使用 C 語言中的 regcomp() 方法構造正規表示式
  3. 使用 C 語言中的 regexec() 方法將字串與已編譯的正規表示式進行比較
C 語言中的正規表示式

C 語言中的正規表示式將是本文討論的主題,並附有一個示例。

C 語言中的正規表示式

由字串組成的正規表示式可用於發現搜尋模式。字串匹配和其他類似應用程式廣泛使用它。

它們是一種將模式序列與字元序列匹配的標準化方法。C、C++、Java 和許多其他主要程式語言都使用它。

在瞭解了正規表示式之後,讓我們看看一些 POSIX 特定的庫模式。

  • 使用 [] 可以輕鬆查詢括號中的字母或數字。
  • [:number:] 可用於定位任何號碼。
  • [:word:] 可以搜尋字母、數字和下劃線。
  • [:lower:] 用於定位字母表的小寫字母。

使用 C 語言中的 regcomp() 方法構造正規表示式

正規表示式 regcomp() 方法用於編譯或構造正規表示式。它需要正規表示式、表示式和標誌。

表示式是字串型別,正規表示式是對匹配和儲存表示式的記憶體區域的引用,標誌用於標識編譯的種類。

如果編譯完成且沒有錯誤,它將返回值 0。如果無法成功編譯表示式,它將輸出錯誤程式碼

語法:

regcomp(&regex, expression, flag)

例子:

  • 建立一個正規表示式型別的變數,並像我們一樣給它命名 r1
    regex_t r1;
    
  • 現在,你需要構建一個變數來儲存正規表示式生成過程的結果,如下所示:
    int regval;
    
  • 通過呼叫函式生成正規表示式:
    regval = regcomp( &r1, "[:word:]", 0);
    
  • Regular Expression compiled successfully. 將在編譯完成後顯示。
    if (value == 0) {
    printf("Regular Expression compiled successfully.");
    }
    
  • 否則,它將引發異常,並顯示訊息 An Error Occurred.
    else {
    	printf("An Error Occurred.");
    }
    

完整的原始碼:

#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;
}

輸出:

Regular Expression compiled successfully.

使用 C 語言中的 regexec() 方法將字串與已編譯的正規表示式進行比較

可以使用 regexec() 函式將字串與模式進行比較。它考慮了一些引數:第一個是已預編譯的模式、包含要查詢的模式的字串、有關匹配位置的資訊以及描述匹配行為變化的標誌。

語法:

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

如果有匹配,這將返回值 0。如果沒有匹配,它將返回 REG NOMATCH

例子:

  • 首先,我們將建立一個名為 DisplayPattern 的函式來顯示結果。如果值為 0,則顯示 Pattern found;如果它不等於 0,它將簡單地顯示 Pattern not found.;否則,它將顯示錯誤提示,並顯示 An error occurred. 訊息。
    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");
    }
    }
    
  • 現在,我們將建立 Main 函式,我們將在其中建立一個名為 r1regex_t 型別變數。
    regex_t r1;
    
  • 為名為 data1data2data3 的返回型別建立三個變數。
    int data1;
    int data2;
    int data3;
    
  • 然後,建立一個正規表示式並將模式與 reg 中的字串進行比較。
    data1 = regcomp( &r1, " I am a writing c language", 0);
    data1 = regexec( &r1, "Hi there its me Zeeshan",0, NULL, 0);
    
  • 如下所示再新增幾個正規表示式,並將模式與 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);
    
  • 最後,使用我們之前建立的 DisplayPattern 函式顯示模式。
    DisplayPattern(data1);
    DisplayPattern(data2);
    DisplayPattern(data3);
    

完整的原始碼:

#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;
}

輸出:

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