Напишите функцию find(), находящую в строке первое вхождение регулярного выражения. Используйте ? для обозначения «любого символа» , * — для обозначения любого числа символов, не отвечающих следующей части регулярного выражения, и [abc] — для обозначения любого символа из тех, что указаны в квадратных скобках (здесь это a,b,c). Другие символы должны совпадать буквально. Например, find(s,»name:») возвращает указатель на первое вхождение name: в строку s; find(s,»[nN]ame:») возвращает указатель на первое вхождение в строку s либо name: либо Name: с дальнейшими (возможно пустыми) последовательностями символов в круглых скобках.
Это вроде как я понимаю тяжелая задача, поэтому я кусочек сделал, для скобок и просто поиск по строке, да ну как то не сильно охота писать громадную функцию, да и вообще это для некоторых случаев будет происходить поиск.
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 |
#include <iostream> using std::cout; using std::endl; #include <string> using std::string; #include <cstdlib> using std::exit; size_t find(string s, string rv) { cout <<s<<' '<<rv<<endl; int flag(0); for(int i=0;i<rv.size();i++) { if(rv[i]=='[')flag=1; if(rv[i]=='?')flag=2; } if(flag==0) { return s.find(rv); } if(flag==1) { cout <<"mu tyt"<<endl; string mass=rv.substr(rv.find('[')+1,(rv.find(']')-rv.find('['))-1); for(int i=0;i<mass.size();i++) { string s2(" "); string rv1=rv;//промежуточная переменная s2[0]=mass[i]; // cout <<"s2= "<<s2<<endl; // cout <<"rv= "<<rv<<endl; string s1=rv1.replace(rv.find('['),rv.find(']')-rv.find('[')+1,s2); // cout <<"s1= "<<s1<<endl; size_t pos=s.find(s1); if(pos!=string::npos)return pos; } exit(1); return string::npos; } return string::npos; } int main() { size_t per=find("hellow world gacpada","[Ww]orld"); if(per!=string::npos) cout <<"per= "<<per<<endl; return 0; } |
[youtube]http://www.youtube.com/watch?v=R07T-0v8ybU[/youtube]