• 通配符


    ? 通配一个字符

    *  通配零至多个字符

    首先确定通配的字符串去掉*后,其长度比要匹配的字符串的长度小,这样就可以按照通配字符串来移动迭代器,而不必担心要匹配的字符串会越界。

    第一个*以前的字符串要严格匹配,第一个*以后的字符串,要属于匹配字符串。

    #include<iostream>
    #include<string>
    #include<list>
    #include<algorithm>
    
    
    using namespace std;
    
    struct Op
    {
    	bool operator()(char a, char b)
    	{
    		if(b == '?')
    		{
    			return true;
    		}
    		else if( b == a)
    		{
    			return true;
    		}
    		else
    		{
    			return false;
    		}
    	}
    };
    
    int main()
    {
    	string youxing;
    	string meixing;
    	cin>>youxing>>meixing;
    	
    	//比较长度,避免后面担心匹配字符串越界
    	list<char>ltemp;
    	ltemp.assign(youxing.begin(),youxing.end());
    	ltemp.remove('*');
    	if(ltemp.size()>meixing.size())
    	{
    		cout<<"false"<<endl;
    		return 0;
    	}
    
    	string::iterator iter1beg,iter1end,iter2beg,iter2end;
    	iter1beg = youxing.begin();
    	iter2beg = meixing.begin();
    	iter1end = find(iter1beg,youxing.end(),'*');
    	//第一个*之前的字符串严格匹配
    	while(iter1beg!=iter1end)
    	{
    		if(*iter1beg != *iter2beg)
    		{
    			if(*iter1beg != '?')
    			{
    				cout<<"false"<<endl;
    				return 0;
    			}
    		}
    		++iter1beg;
    		++iter2beg;
    	}
    
    	//第一个*以后的字符串要属于匹配字符串
    	while(iter1end != youxing.end() && (iter1end+1) != youxing.end())
    	{
    		iter1beg = iter1end+1;
    		iter1end = find(iter1beg,youxing.end(),'*');
    		iter2beg = search(iter2beg,meixing.end(),iter1beg,iter1end,Op());
    		if(iter2beg == meixing.end())
    		{
    			cout<<"false"<<endl;
    			return 0;
    		}
    		else
    		{
    			iter2beg = iter2beg + (iter1end-iter1beg);
    		}
    	}
    	if(iter1end == youxing.end())
    	{
    		if(iter2beg == meixing.end())
    		{
    			cout<<"true"<<endl;
    		}
    		else
    		{
    			cout<<"false"<<endl;
    		}
    	}
    	else if((iter1end+1) == youxing.end())
    	{
    		cout<<"ture"<<endl;
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    C# DataTable 导出到 Excel 的两种方法
    C# Unicode编码解码
    msbuild不是内部或外部命令
    发布web项目时,关于未能加载文件或程序集或它的某一个依赖项。拒绝访问的问题
    hithub中文排行榜
    【MAC工具】手机抓包工具之 —— whistle
    vueApp打包
    TortoiseSVN设置Beyond Compare为版本比较、差异合并工具
    微信公众号开发
    DataTable转List,DataTable转为Model对象帮助类
  • 原文地址:https://www.cnblogs.com/johnsblog/p/3763074.html
Copyright © 2020-2023  润新知