《代码之美》读书笔记
源码出自《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 那么对于要匹配的文本,在前三个匹配完就会结束。

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

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐