简单的正则表达式匹配器
实现一个正则表达式匹配器,给出处理模型,并提供源代码。
处理模型
字符 | 含义 |
---|---|
c | 匹配任意的字母c |
.(句点) | 匹配任意的单个字符 |
^ | 匹配输入字符串的开头 |
$ | 匹配输入字符串的结尾 |
* | 匹配前一个字符的零个或者多个出现 |
实现
#include <iostream>
using namespace std;
int match(char *regexp, char *text);
int matchhere(char *regexp, char *text);
int matchstar(int c, char *regexp, char *text);
int main(){
char *regexp[] = { "001","Th_00._b","T*b$", };
char *fileName[] = { "Th_001_a", "Th_001_b", "Th_001_c", "Th_002_a", "Th_002_a","TTTh_001_b" };
int numOfRegexp = sizeof(regexp) / sizeof(char *);
int numOfFileName = sizeof(fileName) / sizeof(char *);
for (int i = 0; i < numOfRegexp; i++){
cout << "\n表达式:" << regexp[i] << "\n匹配结果:\n";
for (int j = 0; j < numOfFileName; j++){
if (match(regexp[i], fileName[j]))
cout << "文件名:" << fileName[j] << endl;
}
}
return 1;
}
/* 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;
}
说明
函数 int match(char *regexp, char *text)用来判断文本中是否出现正则表达式;如果找到了一个匹配的实例返回1,否则返回0。如果有多个匹配的实例,那么函数将找到文本中最左边的并且最短的匹配实例。