c++函数实现*的正则匹配判断功能

今天在面试的时候面试官出了一道算法题,给出字符串a和字符串b,其中字符串a含有*,这个匹配所有的正则表达式符号,让写出一个函数判断字符串b是否符合规则,面试的时候有些紧张,思路又有些乱,写了一晚上终于成功了,这里提供一下我的算法,欢迎交流沟通。首先贴上完成的代码:


#include<iostream>
using namespace std;

/**********************************************************************
* 名    称:bool match(char *a, char *b, int startA, int startB)
* 功    能:匹配字符串b是否符合正则表达式规则
* 输入参数:字符串a(带*号匹配规则), 字符串b(被匹配的字符), a字符串开始的位置startA, b字符串开始的位置startB
* 返回参数:bool类型
-----------------------------------------------------------------------
* 说    明:无
***********************************************************************/
bool match(char *a, char *b, int startA, int startB)
{
	//字符串a,b的长度
	int lenA   = strlen(a);
	int lenB   = strlen(b);
	//posB,b字符串的startB位置标记
	int	posB = startB;
	//a,b同时结束返回真
	if(startA == lenA && startB == lenB)
	{
		return true;
	}
	//不是*开头 一定要匹配b
	if(a[startA] != '*')
	{
		if(a[startA] != b[startB])
		{
			return false;
		}
		//递归
		return match(a, b, ++startA, ++startB);

	}else{
		//是*开头 找到非*开始的地方
		while(a[startA] == '*' && startA < lenA)
		{
			startA ++;
		}
		//以*结尾 同时遍历结束 返回真
		if(startA == lenA && startB == lenB)
		{
			return true;
		}
	}
	//记录a的位置
	int posA = startA;
	while(startB < lenB) 
	{
		//遍历b找到 与startA 相同的字符
		while(a[startA] != b[startB] && startB < lenB) 
		{
			startB ++;
		}	
		posB = startB;
		//相同均++, a到头或者a遍历到*结束
		while(a[startA] == b[startB] && startA < lenA && a[startA] != '*')
		{
			startA ++;
			startB ++;
		}
		//a遍历到*并且没有结束的情况递归
		while(a[startA] == '*' && startA < lenA) 
		{
			return match(a, b, startA, startB);
		}
		//a,b同时到头的情况,返回true
		if(startA == lenA && startB == lenB) {
			
			return true;
		}
		//没有发现满足的字符串,b的startB + 1,在次做遍历
		startA = posA;
		startB = posB + 1;
	}
	return false;
}


void main() 
{
	char *a = "*a*b*c*";
	char *b = "adbaeabeaeac";

	bool c = match(a, b, 0, 0);
	cout<<c<<endl;

}
算法解析:
函数是用C++写的,运用递归的思想。分为*开头和非*开头的情况。非*开头一路找到非*的位置开始匹配。
这里有个小坑,例如在字符串ababababcab中找abc的位置,这是比较常见的KMP算法,数据结构中有学,这里找到abc的位置后,两个字符串进行截取后再递归调用函数
测试用例:
分别进行了以下测试用例

字符串a为,字符串为符合和不符合的情况


测试通过!!
有兴趣的朋友们可以自己下载程序试一试,同时欢迎提供更好的算法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中使用正则表达式进行匹配需要使用第三方库,如 PCRE(Perl Compatible Regular Expressions)。使用 PCRE 库中的函数 pcre_compile() 和 pcre_exec() 可以实现正则表达式匹配。 下面是一个示例代码,它使用正则表达式 ".*" 匹配输入字符串中的任意字符(包括 * 字符): ```c #include <pcre.h> int main() { const char *pattern = ".*"; const char *subject = "Hello, world!"; int rc; int ovector[30]; pcre *re; re = pcre_compile(pattern, 0, &error, &erroffset, NULL); rc = pcre_exec(re, NULL, subject, strlen(subject), 0, 0, ovector, 30); if (rc < 0) { printf("No match\n"); } else { printf("Match\n"); } return 0; } ``` 这段代码会输出 "Match"。 ### 回答2: 正则表达式中的*是重复符号,它表示匹配前面的子表达式零次或多次。而在正则表达式匹配字符*本身需要使用转义符号\。 要正则匹配一个*字符,可以使用如下方式: 1. 使用转义符号\匹配字符*,表达式为:\* 2. 使用字符类[]来将*字符进行匹配,表达式为:[*] 3. 使用元字符.来匹配任意字符,表达式为:. 以下是三种方式的示例说明: 1. 使用转义符号\匹配字符*,例如表达式"ab\*c"可以匹配字符串"abc"、"ab*c"、"ab**c"等。 2. 使用字符类[]匹配字符*,例如表达式"ab[*]c"可以匹配字符串"ab*c",但不能匹配字符串"abc"。 3. 使用元字符.匹配任意字符,例如表达式"ab.c"可以匹配字符串"abc"、"ab*c"、"ab3c"等。 总之,要在正则表达式匹配字符*,可以使用转义符号\、字符类[]或元字符.来实现。 ### 回答3: 在正则表达式中,"*" 是一个特殊符号,它代表前面的字符可以出现任意次数(包括零次)。 如果我们需要匹配一个"*"字符本身,我们可以使用转义字符"\*"来实现,"\*"告诉正则表达式引擎将"*"字符视为普通字符,而不是特殊的元字符。 以下是一个例子,演示了如何使用正则表达式匹配一个"*"字符: ```python import re # 定义一个包含"*"字符的字符串 string = "Hello, this is a * symbol." # 使用re模块的search方法进行匹配 match = re.search(r'\*', string) # 检查匹配结果 if match: print("匹配成功!找到一个'*'字符。") else: print("没有找到匹配的'*'字符。") ``` 在上述例子中,我们使用re模块的search方法进行匹配,其中的正则表达式模式是 `\*` 。这个模式用于匹配一个"*"字符,"\*"前面的反斜杠是用来转义"*"字符的。 运行上述代码,我们会得到输出结果为:"匹配成功!找到一个'*'字符。",表示在给定的字符串中成功找到了一个"*"字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值