首页 > 代码库 > 通配符
通配符
? 通配一个字符
* 通配零至多个字符
首先确定通配的字符串去掉*后,其长度比要匹配的字符串的长度小,这样就可以按照通配字符串来移动迭代器,而不必担心要匹配的字符串会越界。
第一个*以前的字符串要严格匹配,第一个*以后的字符串,要属于匹配字符串。
?
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; } |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。