std::basic_string::find Vereinfachen [gelöst]
-
Meine Vermutung ist ja, dass eingentlich eine Regex
/\b(?:ja|jawohl|sicher|bestimmt)\b/igesucht ist. Alternativ wäre es auch sinnvoll, erst einmal den Text (ggf. erst in einzelne Sätze und dann) in einzelne Wörter zu splitten und diese dann zu vergleichen. Es erscheint merkwürdig, Wortteile zu vergleichen.
-
Ich meinte nix Kompliziertes und es kommt ja eigentlich sowieso nicht in Frage.
template<typename charT> struct CICmp { CICmp(const std::locale& loc) : m_loc(loc) { } bool operator()(charT ch1, charT ch2) { return std::tolower(ch1, m_loc)==std::tolower(ch2, m_loc); } private: const std::locale& m_loc; }; template<typename T> size_t ci_find(const T& str1, const T& str2, const std::locale& loc=std::locale()) { typename T::const_iterator it=std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), CICmp<typename T::value_type>(loc)); if (it!=str1.end()) return it-str1.begin(); return -1; } int main() { using namespace std; string str1 = "Guten Tag und Hallo"; string str2 = "hallo"; size_t f1 = ci_find(str1, str2); cout << f1 << '\n'; // liefert wie string::find den Index, also hier 14 wstring wstr1 = L"Guten Tag und Hallo"; wstring wstr2 = L"tag"; size_t f2 = ci_find(wstr1, wstr2); cout << f2 << '\n'; // 6 }
-
@wob Prinzipiell ist alles gesucht, was meinen Anforderungen entspricht. Da gehören
regex_searchundregex_matchsicher auch dazu!Nur sehe ich keinen entscheidenden Unterschied zwischen
regex_searchundstd::basic_string::findbzw.regex_matchund==.Der Sinn hinter einem Vergleich auf Wortteile ist, dass man nicht auf verschiedene Worte oder Deklinationen untersuchen muss, sondern nur auf Wortstämme. Natürlich kann es da zu Diskrepanzen kommen, wenn man beispielsweise nach "ja" sucht. Deshalb bietet sich für kürzere Wörter auf jeden Fall ein direkter Vergleich an.
-
@yahendrik sagte in std::basic_string::find Vereinfachen [gelöst]:
nix Kompliziertes
Dein Code übersteigt auf jeden Fall meinen Kenntnisstand ^^ Aber ich glaube ich verstehe, worauf du im Kern hinauswillst.
std::searchscheint gut geeignet zu sein, aber ist doch im Prinzip nichts anderes alsstd::basic_string::findmit einer range oder?