std::basic_string::find Vereinfachen [gelöst]
-
Meine Vermutung ist ja, dass eingentlich eine Regex
/\b(?:ja|jawohl|sicher|bestimmt)\b/i
gesucht 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_search
undregex_match
sicher auch dazu!Nur sehe ich keinen entscheidenden Unterschied zwischen
regex_search
undstd::basic_string::find
bzw.regex_match
und==
.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::search
scheint gut geeignet zu sein, aber ist doch im Prinzip nichts anderes alsstd::basic_string::find
mit einer range oder?