用C语言实现正则表达式匹配器

本文介绍了《The Practice of Programming》一书中关于正则表达式的实现细节,通过精简而强大的C语言代码展示了如何处理包括句点、开头、结尾及闭包等基本元素的匹配过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《代码之美》读书笔记
源码出自《The Practice of Programming》一书的第9章
用来处理以下模型

字符含义
.(句点)匹配任意的单个字符
^匹配输入字符串的开头
$匹配输入字符串的结尾
*匹配前一个字符的零个或者多个出现
/* match: search for regexp anywhere in text */
    int match(char *regexp, char *text)
    {
        if (regexp[0] == '^')
            return matchhere(regexp+1, text);
        do { /* must look even if string is empty */
            if (matchhere(regexp, text))
                return 1;
        } while (*text++ != '\0');
        return 0;
    }

/* matchhere: search for regexp at beginning of text */
    int matchhere(char *regexp, char *text)
    {
        if (regexp[0] == '\0')
            return 1;
        if (regexp[1] == '*')
            return matchstar(regexp[0], regexp+2, text);
        if (regexp[0] == '$' && regexp[1] == '\0')
            return *text == '\0';
        if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text))
            return matchhere(regexp+1, text+1);
        return 0;
    }

/* matchstar: search for c*regexp at beginning of text */
    int matchstar(int c, char *regexp, char *text)
    {
        do { /* a * matches zero or more instances */
        if (matchhere(regexp, text))
            return 1;
        } while (*text != '\0' && (*text++ == c || c == '.'));
        return 0;
    }
int match(char *regexp, char *text)

调用该函数进行正则表达式匹配。
参数regexp为正则表达式,参数text为要匹配的字符串。

int matchhere(char *regexp, char *text)

该函数判断正则表达式的第一个字符与文本的第一个字符是否匹配,失败在返回0。成果则推进到正则表达式的下一个字符和文本的下一个字符继续进行匹配。如果正则表达式的第二字符为*,则调用下面的函数,判断闭包是否匹配。

int matchstar(int c, char *regexp, char *text)

匹配重复字符c,直到text的剩余字符匹配成功,如果text的剩余字符直到最后也匹配失败,返回0。使用do-while结构是因为*也可以匹配0个。

自己输了一些例子试了下,发现这个算法是追求最快匹配的。比如正则表达式是 aaa.* 要匹配的文本是 aaaabaaa 那么对于要匹配的文本,在前三个匹配完就会结束。

真是精简但强大的代码啊,建议自己设置断点调试,看看流程,加深理解。(其实是因为我自己也只能读懂,还不能写出来,写不出太多的分析了……)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值