Regular Expression Matching

本文介绍了一种正则表达式匹配的实现方法,重点讨论了如何处理特殊字符'.'和'*',并提供了一个具体的C++代码示例。通过递进的方式解决了匹配问题,并考虑了多种边界情况。

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

Implement regular expression matching with support for '.' and '*'.
'.' Matches any single character. '*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true

isMatch("aab", "c*a*b") → true

注意:这里的a*表示a可以重复0次或者多次,不是a和*分开的。

思路:

待匹配串为S,匹配串为P。

简化问题,假设P中没有'*',那么我们只需要一位一位的比较S和P。

回到原问题,对于S[i]和P[j]:

如果P[j+1]!='*',S[i] == P[j]=>匹配下一位(i+1, j+1),S[i]!=P[j]=>return false;

如果P[j+1]=='*',如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.

#include <iostream>
using namespace std;

bool reqularMatch(string s,string p)
{
	for(int i=0;i<s.length();i++)
	{
		for(int j=0;j<p.length();j++)
		{
			if(s[i] == p[j])
			{
				int m =i+1,n=j+1;
				while(m<s.length()&&n<p.length())
				{
					if(p[n] != '*')
					{
						//如果下一个不是‘*’
						if(p[n] == '.' || s[m] == p[n])
						{
							m++;
							n++;
						}						
						else
						{
							return false;
						}
					}
					else
					{
						//如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.
						//如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.
						int ai = m-i+1;
						int aj = 0;
						int w = j;
						while(s[m]!=p[w]&&aj<=ai)
						{							
							if(p[w]=='*')
							{
								w++;
								if(w==p.length()) return false;
								continue;
							}								
							aj++;
							w++;
							if(w==p.length()) return false;
						}

						if(ai == aj)
						{
							return false;
						}						
						m++;						
					}
				}
				
			}
		}
	}
	return true;
}

void main()
{
	string s= "ab";
	string p= "c*ab*";
	bool flag = reqularMatch(s,p);
	printf("%s",flag?"Match!\n":"Not match!\n");
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值