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 und regex_match sicher auch dazu!

    Nur sehe ich keinen entscheidenden Unterschied zwischen regex_search und std::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 als std::basic_string::find mit einer range oder?


Anmelden zum Antworten