Lösung zu einer Stroustrup Aufgabe
-
Hallo!
Kann mir jemand die Lösung zu folgender Aufgabe, aus "Die C++ Programmiersprache", schicken?
Aufgabe:Die C++ Programmiersprache schrieb:
Kap 20.6 Ü7:
Schreiben Sie eine find()-Funktion, die in einem Sting nach dem ersten passenden regulären Ausdruck sucht. Verwenden sie ? mit der Bedeutung "beliebiges Zeichen", * für "beliebig viele Zeichen, außer der danach
folgenden Angabe" und [abc] für die Angabe "eines der Zeichen zwischen den eckigen Klammern angegebenen Zeichen" (hier also a, b, c). Andere Zeichen stehen für sich selbst. Der Ausdruck find(s,"name:") liefert z.B. die
Position für das erste Vorkommen von "name:" in s. Der Ausdruck find(s,"[nN]ame:") liefert z.B. die Position für das erste Vorkommen von "name:" oder "Name:" in s. Der Ausdruck find(s,"[nN]ame:(*)") liefert z.B. die Position
für das erste Vorkommen von "name:" oder "Name:", gefolgt von einer (möglicherweise leeren) eingeklammerten
Zeichenfolge in s.Ich kriegs einfach nicht richtig hin da was vernünftiges zu schreiben. Ich kann immerhin entweder 1 ? oder 1 * oder ein [aa] (mit beliebig vielen Zeichen drin) machen. Mehr kriege ich nicht hin. Und ich will keine Bibliothek wie z.B. Boost benutzen, da mir das was die Funktion können soll für meine Zwecke voll und ganz reicht, nur müsste ich mehr als nur von jedem 1 zur Zeit verwenden dürfen.
Danach werde ich mir mal das Löungsbuch selbst holen und damit die Aufgaben durcharbeiten die ich nicht 100%-ig geschafft habe.Vielen Dank schon mal im Voraus.
Code-Hacker
-
Keiner die Lösung oder einen Algorithmus den er mir geben kann?
Ich habe immerhin schon mal rausgefunden das Backtracking eine Möglichkeit bietet das Problem ganz zu lösen und nicht wie bei mir mit ner Schleife.Code-Hacker
-
Oder nen Vorschlag wie man folgendes verbessern kann, also das es auch mit allen Möglichkeiten geht?
Bisheriger Source für das Problem:std::size_t find_regexp(std::string suchin, std::string suchstr) { using namespace std; size_t pos = string::npos; size_t fPos = suchstr.find('?'); size_t sPos = suchstr.find('*'); size_t kPos1 = suchstr.find('['); size_t kPos2 = suchstr.find(']'); if(fPos!=string::npos) { string tmp1 = suchstr.substr(0, fPos); string tmp2 = suchstr.substr(fPos+1); // Schleife für genau EIN '?' !!! for(size_t i=0; i<suchin.length(); ++i) if(suchin.substr(i,tmp1.length())==tmp1) if(suchin.substr(i+tmp1.length()+1,tmp2.length())==tmp2) { pos=i; break; } } if(sPos!=string::npos) { string tmp1 = suchstr.substr(0, sPos); string tmp2 = suchstr.substr(sPos+1); // Schleife für genau EIN '*' !!! for(size_t i=0; i<suchin.length(); ++i) if(suchin.substr(i,tmp1.length())==tmp1) { if(suchin.substr(i+tmp1.length()).find(tmp2)+i+tmp1.length()>=i+tmp1.length()) { pos = i; break; } } } if((kPos1!=string::npos) && (kPos2!=string::npos)) { string tmp1 = ""; if(kPos1>0) tmp1 = suchstr.substr(0,kPos1); string tmp2 = suchstr.substr(kPos1+1, kPos2-kPos1-1); pos = suchin.find(tmp1+tmp2[0]+suchstr.substr(kPos2+1)); for(size_t i = 1; i<(kPos2-kPos1-1); ++i) if(pos>suchin.find(tmp1+tmp2[i]+suchstr.substr(kPos2+1))) pos = suchin.find(tmp1+tmp2[i]+suchstr.substr(kPos2+1)); } if((fPos==string::npos) && (sPos==string::npos) && ((kPos1==string::npos) || (kPos2==string::npos))) pos = suchin.find(suchstr); return pos; }
Code-Hacker