面试题19:正则表达式匹配(通俗易懂版代码)

本文详细解析了一道经典的正则表达式匹配题目,通过重写剑指Offer中的代码并加以详尽注释,帮助读者更好地理解正则匹配的原理与实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把剑指offer上的代码全部展开,然后重写了一下并详细解释,感觉这样更好理解一些。
代码实现如下:

#include <iostream>
#include <assert.h>
using namespace std;

bool matchCore(char *str, char *pattern);

bool match(char* str, char* pattern) {
	if (str == nullptr || pattern == nullptr) return false;
	return matchCore(str, pattern);
}

bool matchCore(char *str, char *pattern) {
	if (*str == '\0' && *pattern == '\0') // 全部匹配成功
		return true;

	if (*str != '\0' && *pattern == '\0') // 字符串还没匹配完,模式串pattern就已经没有了
		return false;

	if (*(pattern + 1) == '*') { // 特殊情况:如果pattern下一个字符为'*'
		if (*pattern == *str) { // 如果*str等于*pattern,说明匹配成功
			return matchCore(str, pattern + 2) // 情况1:我可以匹配0次,str指针不动,pattern指针向后移动
				|| matchCore(str + 1, pattern + 2) // 情况2:我就匹配这一次,str指针向后移动,pattern指针也向后移动
				|| matchCore(str + 1, pattern); // 情况3:我可以匹配多次:str指针向后移动,pattern指针不动。
		}
		else if (*pattern == '.' && *str != '\0') { // 如果*pattern表示任意字符,并且*str没结束,则肯定能够匹配成功啊
			// 这波操作和上面完全一样 
			return matchCore(str, pattern + 2) 
				|| matchCore(str + 1, pattern + 2) 
				|| matchCore(str + 1, pattern); 
		}
		else { // *str不等于*pattern,匹配失败,但*是可以允许匹配失败,所以跳过这部分pattern即可
			return matchCore(str, pattern + 2);
		}
	}
	else { // 普通情况:看看*str是否等于*pattern
		if (*str == *pattern) // 如果*str 等于 *pattern
			return matchCore(str + 1, pattern + 1) ; // 匹配成功,str与pattern同时向后移动
		else if (*pattern == '.' && *str != '\0') // 如果*pattern是任意字符,且str未结束
			return matchCore(str + 1, pattern + 1); // 同上
		else // 匹配失败
			return false; // 匹配是真的失败了
	}

	assert(0);
}


int main()
{
	
	cout << match("aaa", "ab*aa") << endl;

	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值