1、使用正则表达式
在 C 中使用正则表达式,需要包含 regex.h
头文件。使用 regcomp()
函数将正则表达式字符串编译成正则表达式对象。使用 regexec()
函数执行匹配操作,判断一个字符串是否符合给定的正则表达式。使用 regfree()
函数释放由 regcomp()
创建的正则表达式对象。
#include <stdio.h> #include <stdlib.h> #include <regex.h> int main() { regex_t regex; int ret; const char *pattern = "^[a-zA-Z0-9]+$"; // 只允许字母和数字的正则表达式 const char *string = "Hello123"; // 待匹配的字符串 // 编译正则表达式 ret = regcomp(®ex, pattern, REG_EXTENDED); if (ret) { printf("Could not compile regex\n"); return 1; } // 执行正则表达式匹配 ret = regexec(®ex, string, 0, NULL, 0); if (!ret) { printf("Match found!\n"); } else if (ret == REG_NOMATCH) { printf("No match found\n"); } else { char msgbuf[100]; regerror(ret, ®ex, msgbuf, sizeof(msgbuf)); printf("Regex match failed: %s\n", msgbuf); } // 释放正则表达式对象 regfree(®ex); return 0; }
2、 匹配操作
正则表达式匹配操作可以使用 regcomp()
编译正则表达式,regexec()
执行匹配,regfree()
释放资源。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <regex.h> int main() { // 要匹配的正则表达式 char *pattern = "^\\d{3}-\\d{2}-\\d{4}$"; // 格式:xxx-xx-xxxx(SSN) // 要匹配的字符串 char *string = "123-45-6789"; regex_t regex; regmatch_t matches[1]; // 存储匹配的结果 // 编译正则表达式 if (regcomp(®ex, pattern, REG_EXTENDED)) { printf("正则表达式编译失败!\n"); return 1; } // 执行正则表达式匹配 if (regexec(®ex, string, 1, matches, 0) == 0) { printf("匹配成功!\n"); } else { printf("匹配失败!\n"); } // 释放正则表达式编译的内存 regfree(®ex); return 0; }
3、替换操作
C 语言中并没有直接的替换函数,但可以通过手动操作字符串来实现替换功能。通常会用正则表达式来查找匹配的部分,然后使用 strcpy()
或其他字符串函数进行替换。
#include <stdio.h> #include <string.h> #include <regex.h> #define MAX_MATCHES 10 #define RESULT_SIZE 1024 // 替换字符串 void regex_replace(const char *input, const char *pattern, const char *replacement) { regex_t regex; regmatch_t pmatch[MAX_MATCHES]; char result[RESULT_SIZE]; size_t result_index = 0; // 编译正则表达式 if (regcomp(®ex, pattern, REG_EXTENDED)) { printf("Could not compile regex\n"); return; } // 查找所有匹配 const char *ptr = input; while (regexec(®ex, ptr, MAX_MATCHES, pmatch, 0) == 0) { // 复制匹配之前的部分 size_t match_start = pmatch[0].rm_so; size_t match_len = pmatch[0].rm_eo - pmatch[0].rm_so; // 如果有足够的空间,复制匹配前的部分 if (result_index + match_start < RESULT_SIZE) { strncpy(result + result_index, ptr, match_start); result_index += match_start; } // 插入替换内容 if (result_index + strlen(replacement) < RESULT_SIZE) { strcpy(result + result_index, replacement); result_index += strlen(replacement); } // 移动指针到匹配后的部分 ptr += pmatch[0].rm_eo; } // 复制剩余的部分 if (result_index + strlen(ptr) < RESULT_SIZE) { strcpy(result + result_index, ptr); } // 输出结果 printf("Result: %s\n", result); // 释放正则表达式资源 regfree(®ex); } int main() { const char *input = "I have 10 apples and 20 oranges."; const char *pattern = "[0-9]+"; // 匹配数字 const char *replacement = "[number]"; // 替换为[number] regex_replace(input, pattern, replacement); return 0; }