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