代码之美——30行代码实现正则表达式匹配器
Rob Pike在《The Practice of Programming》中使用约30行代码,实现了一个正则表达式匹配器,用来处理以下的模型。
字符 | 含义 |
c | 匹配认字的字母c |
.(句点) | 匹配任意的单个字符 |
^ | 匹配输入字符串的开头 |
$ | 匹配输入字符串的结尾 |
* | 匹配前一个字符的零个或者多个出现 |
这段代码紧凑、优雅,高效并且实用,同时展示了C指针的强大功能。
/*match :在text中查找regexp*/ int match(char *regexp,char *text) { if(regexp[0] == '^') return matchhere(regexp+1,text); do{ /*即使字符串为空也必须检查*/ if (matchhere(regexp,text)) return 1; }while (*text++!= '\0'); return 0; } /*matchhere在text的开头查找regexp*/ 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 :在text的开头查找C*regexp*/ int matchstar (int c,char *regexp,char *text) { do { /*通配符*匹配零个或多个实例*/ if (matchhere(regexp,text)) return 1; }while (*text!='\0' && (*text++ ==c || c== '.')); return 0; }
今天边晒太阳,边看《代码之美》,体会大师思想,真是种不错的享受!
摘自书上原文,有网友已经做好,故转载之~