用C实现一个最简单的正则表达式引擎

用C实现一个简单的正则表达式引擎

下面我将实现一个极简的正则表达式引擎,仅支持以下基本功能:

  • . 匹配任意单个字符
  • * 匹配零个或多个前导字符
  • ^ 匹配字符串开头
  • $ 匹配字符串结尾

完整代码实现

c 复制代码
#include <stdio.h>
#include <stdbool.h>

bool match_here(const char *regexp, const char *text);
bool match_star(char c, const char *regexp, const char *text);

/* 正则表达式匹配入口函数 */
bool regex_match(const char *regexp, const char *text) {
    // 处理 ^ 开头的情况
    if (regexp[0] == '^') {
        return match_here(regexp + 1, text);
    }
    
    // 尝试在文本的每个位置匹配
    do {
        if (match_here(regexp, text)) {
            return true;
        }
    } while (*text++ != '\0');
    
    return false;
}

/* 在当前位置尝试匹配 */
bool match_here(const char *regexp, const char *text) {
    // 正则表达式已结束,匹配成功
    if (regexp[0] == '\0') {
        return true;
    }
    
    // 处理 $ 结尾的情况
    if (regexp[0] == '$' && regexp[1] == '\0') {
        return *text == '\0';
    }
    
    // 处理 * 量词
    if (regexp[1] == '*') {
        return match_star(regexp[0], regexp + 2, text);
    }
    
    // 处理 . 通配符或普通字符匹配
    if (*text != '\0' && (regexp[0] == '.' || regexp[0] == *text)) {
        return match_here(regexp + 1, text + 1);
    }
    
    return false;
}

/* 处理 * 量词匹配 */
bool match_star(char c, const char *regexp, const char *text) {
    do {
        // 尝试匹配剩余部分
        if (match_here(regexp, text)) {
            return true;
        }
    } while (*text != '\0' && (*text++ == c || c == '.'));
    
    return false;
}

/* 测试函数 */
int main() {
    const char *tests[][2] = {
        {"a", "a"},             // 匹配
        {"a", "b"},             // 不匹配
        {"a*", ""},             // 匹配
        {"a*", "aaaaa"},        // 匹配
        {".*", "anything"},     // 匹配
        {"^a", "a"},            // 匹配
        {"^a", "ba"},           // 不匹配
        {"a$", "a"},            // 匹配
        {"a$", "ab"},           // 不匹配
        {"a*b", "aaaab"},       // 匹配
        {"a*b", "b"},           // 匹配
        {"a*b", "aaaac"},       // 不匹配
        {NULL, NULL}
    };
    
    for (int i = 0; tests[i][0] != NULL; i++) {
        bool result = regex_match(tests[i][0], tests[i][1]);
        printf("'%s' matches '%s': %s\n", 
               tests[i][0], tests[i][1], result ? "true" : "false");
    }
    
    return 0;
}

实现解析

  1. 核心函数

    • regex_match(): 入口函数,处理 ^ 开头的情况
    • match_here(): 在当前位置尝试匹配
    • match_star(): 专门处理 * 量词匹配
  2. 匹配逻辑

    • 普通字符:必须精确匹配
    • .:匹配任意单个字符
    • *:匹配前导字符零次或多次(贪婪匹配)
    • ^:必须从字符串开头匹配
    • $:必须匹配到字符串结尾
  3. 递归实现

    • 通过递归调用实现模式匹配
    • 遇到 * 时尝试所有可能的匹配长度

扩展建议

这个简单引擎可以进一步扩展:

  1. 添加 +(一次或多次)和 ?(零次或一次)量词
  2. 支持字符类 [a-z]
  3. 实现转义字符 \
  4. 添加分组捕获功能

这个实现参考了Rob Pike在《The Practice of Programming》中介绍的正则表达式引擎设计,是一个非常精简但完整的实现。

相关推荐
huaweichenai4 小时前
php 根据每个类型的抽签范围实现抽签功能
开发语言·php
zlinear数据采集卡10 小时前
基准电压电路深度解析:从理论参数到ZLinear采集卡的精准参考实战
c语言·单片机·嵌入式硬件·fpga开发·自动化
Cheng小攸10 小时前
入侵检测环境部署
开发语言·php
日晨难再10 小时前
C语言&Python&Bash&Tcl:全局变量和局部变量
c语言·python·bash·tcl
xingpanvip11 小时前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
FBI HackerHarry浩11 小时前
第二阶段Day07【Python生成器、yield关键字、property、正则表达式】
开发语言·python·正则表达式
陕西企来客12 小时前
2026 西安 GEO 优化技术解析:前沿技术与行业规范深度企来客科技行业白皮书声明
开发语言·搜索引擎·php
AI科技星12 小时前
基于光速螺旋第一性原理:$G,\varepsilon_0,\alpha$引电统一完整推导+严谨证明+高精度数值全维度分析
c语言·开发语言·网络·量子计算·agi
淘矿人12 小时前
DeepSeek V4对决Claude 4.8:AI模型终极横评
java·开发语言·人工智能·python·sql·php·pygame
xgstb12 小时前
C语言随机数生成技巧
c语言·伪随机数·time函数·srand函数·随机数生成