首页 > 代码库 > 通配符

通配符

? 通配一个字符

*  通配零至多个字符

 

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

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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#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;
}