这道题应该怎么做啊 求解 字符串的模式匹配问题

正则表达式是一个非常强大而实用的东西,可以用一个模式串匹配一系列符合规则的字符串。这次我们要实现的就是一个正则表达式的匹配工具。

虽然正则表达式的规则很复杂,但是有几个核心的规则,只要实现就可以处理大多数的问题:

c:匹配任意字母c

.:匹配任意的单个字符

^:匹配输入字符串的开头

$:匹配输入字符串的结尾

*:匹配前一个字符的零个或者多个出现。例如zo*可以匹配z、zo、zoo、zooo

?:匹配前一个字符0次或一次。例如zo?可以匹配z、zo

+:匹配前一个字符1次或多次。例如zo+可以匹配zo、zoo、zooo,但是不能匹配z

输入第一行为一个正则表达式的模式串,只包含大小写字母和以上字符。1<=串长<=20。数据保证合法。

输入第二行开始,每行一个字符串,只包含大小写字母。1<=串长<=100

输入以EOF结束。字符串的个数不超过100

对于输入的每个字符串,如果模式串可以匹配,输出“YES”,否则输出"NO"

Hint:

1、^最多只可能在最前出现一次

2、$最多只可能在最后出现一次

3、?、*、+前一定是一个字母或者.


测试输入:

^ab*c?d+.$
b
ad
adb
adcc
abbbbbbbbbbcddddd
 
测试输出:
NO
NO
YES
NO
YES
 
//摘自《代码之美》
// 字符     含义
// .        匹配任意的单个字符
// ^        匹配输入字符串的开头
// $        匹配输入字符串的结尾
// *        匹配前一个字符的零个或者多个出现
#include <stdio.h>
int matchhere(char *regexp, char *text);
//regexp模式串 text匹配字符串
int matchstar(int c, char *regexp, char *text) 
{// matchstar: search for c*regexp at beginning of text
	do 
	{
		// a * matches zero or more instances
		if (matchhere(regexp, text)) return 1;
	} while (*text != '\0' && (*text++ == c || c == '.'));
	return 0;
}
int matchhere(char *regexp, char *text)
{
	// matchhere: search for regexp at beginning of 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;
}


int match(char *regexp, char *text) 
{
	// match: search for regexp anywhere in text
	if (regexp[0] == '^') return matchhere(regexp+1, text);
	do
	{
		// must look even if string is empty
		if (matchhere(regexp, text)) return 1;
	} while (*text++ != '\0');
	return 0;
}
void main() 
{
	printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));
	printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));
	printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));
	printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));
	printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));
	printf("-------------------\n");
	printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));
	printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));
	printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));
	printf("%d==match(a..c,abc)\n",match("a..c","abc"));
	printf("%d==match(a.*d,abc)\n",match("a.*d","abc"));
	printf("-------------------\n");
	//printf("%d==match()\n",match("a*b*","aba"));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值