C++正则表达式匹配器

简单的正则表达式匹配器

实现一个正则表达式匹配器,给出处理模型,并提供源代码。

处理模型

字符含义
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。如果有多个匹配的实例,那么函数将找到文本中最左边的并且最短的匹配实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值