C 语言中的正则表达式

Muhammad Zeeshan 2023年10月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