下面的代码实现如下语法
字符 含义
c 匹配任意的字母c
. (句点) 匹配任意的单个字符
^ 匹配输入字符串的开头
$ 匹配输入字符串的结尾
* 匹配前一个字符的零个或者多个出现
+ 匹配前一个字符的1个或多个出现
? 匹配前一个字符的0个或1个出现
-----------------------
对代码之美上面的例子进行简单的扩展,输出是否匹配,并输出匹配串
---------------------
#include <stdio.h> #include <string> bool matchHere(const char *reg,const char *text); bool matchStar(int c,const char *reg,const char *text); bool matchQuestion(int c,const char *text); bool matchPlus(int c,const char *text); using std::string; string matchStr; bool match(const char *reg,const char *text) { matchStr.clear(); //只在起始位置开始匹配 if (reg[0] == '^') { return matchHere(reg + 1,text); } //可以从任意位置开始匹配 while (*text != '\0') { matchStr.clear(); if (matchHere(reg,text) == true) return true; text++; } return false; } bool matchHere(const char *reg,const char *text) { if (*reg == '\0') return true; switch (reg[1]) { case '*': return matchStar(reg[0],reg + 2,text); case '+': return matchPlus(reg[0],text); case '?': return matchQuestion(reg[0],text); } if (reg[0] == '$' && *text == '\0' && reg[1] == '\0') return true; if (*text != '\0' && (*reg == *text || *reg == '.') ) { //向下走一个字符,就把当前字符添加到匹配串中(当后面出现matchHere(...,text + 1)时) matchStr += *text; return matchHere(reg + 1,text + 1); } return false; } bool matchQuestion(int c,const char *text) { //匹配0个出现 if (matchHere(reg,text) == true) return true; //匹配1个出现 if (c == *text) { matchStr += *text; if (matchHere(reg,text + 1) == true) return true; } return false; } bool matchPlus(int c,const char *text) { //匹配1个或多个出现 while (*text == c) { matchStr += *text; if (matchHere(reg,text + 1) == true) return true; text++; } return false; } bool matchStar(int c,const char *text) { do { if (matchHere(reg,text) == true) return true; matchStr += *text; } while (*text != '\0' && *text++ == c); return false; } int main() { char regExp[100],text[300]; while (true) { printf("text: "); gets(text); printf("regExp: "); gets(regExp); printf("%s -- %s\n",match(regExp,text) ? "true" : "false",matchStr.c_str()); } }
参考:代码之美 原文链接:https://www.f2er.com/regex/361358.html