Suche im Text nach Wörtern die mit einem Großbuchstaben -> Wie



  • Hier ein kleines Codebeispiel, absichtlich nicht kommentiert. Also nicht einfach nur die Paste verwenden (keine Garantie auf Fehlerfreiheit), sondern geh den Code durch und versuch ihn zu verstehen. Vielleicht findest Du ja noch die eine oder andere Verbesserung. Es gibt sicherlich auch noch andere Lösungsansätze ohne Pointer im AnsiString 😃

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	ListBox1->Items->Clear();
    	ExtractWords(Edit1->Text, ListBox1->Items);
    }
    //---------------------------------------------------------------------------
    void TForm1::ExtractWords(AnsiString Line, TStrings *WordList)
    {
    	char c;
    	char *p, *pLine;
    
    	Line.Unique();
    	for(pLine=Line.c_str(); (c=*pLine)!=0;)
    	{	if(c>='A' && c<='Z')
    			pLine=ExtractWord(pLine, WordList);
    		else
    			 pLine++;
    	}
    }
    //---------------------------------------------------------------------------
    char* TForm1::ExtractWord(char *pLine, TStrings *WordList)
    {
    	char *p;
    
    	if((p=strchr(pLine, ' '))!=NULL)
    	{	*(p++)=0;
    		WordList->Add(pLine);
    	}
    	else
    	{	WordList->Add(pLine);
    		p=strchr(pLine, 0);
    	}
    	return p;
    }
    


  • Danke, habe es schon auf eine Andere Weise gelößt, aber interresantes Code-Bsp.

    Ich Arbeite hauzptsächlich mit AnsiString / String. Du wohl eher mit der Basisklasse char.

    Machst du das der Kompatibilität wegen oder bist du konservativ 😉 ?

    danke auf jeden fall...werd das mal durchgehen



  • Du wohl eher mit der Basisklasse char

    char ist keine Klasse sondern ein Datentyp

    Machst du das der Kompatibilität wegen oder bist du konservativ

    Sagen wir mal so, wenn ich alles nur mit der VCL lösen würde, braüchte ich kein C/C++ sondern könnte gleich Delphi oder Basic programmieren. Ausserdem mal ganz allgemein gesprochen, wenn jemand meint C/C++ programmieren zu können nur weil er munter bunte Kompos auf die Form klickt und Lösungen z.B. bei Torry sucht ... 🙄
    Aber lassen wir es gut sein, jeder hat so seine eigene Meinung. Des Menschen Wille ist sein Himmelreich 🕶



  • Machst du das der Kompatibilität wegen oder bist du konservativ

    Zu diesem Thema noch, was sich vielleicht manch einer überlegen sollte der den BCB verwendet:
    Programmiere ich in VCL oder wirklich in C/C++ 🤡



  • Naja,

    ich benutze kaum Komponenten bzw, schreib ich sie neu und benutze sie höchstens als Grundlage...aber ich wüsste nicht, wieso du nicht zumindest "string" verwendest, welches mitlerweile auch eine "Datentyp" von C++ ist..

    du kannst jeden Datentyp als eine Klasse bezeichnen. auch int hat methoden( für die jeweiligen operatoren)...der ausdruck Datentyp ist in C entstanden..
    jede Klasse ist in dem sinne auch nur ein Custom-Datentyp..

    genau das selbe ist mit Structures...sind auch nur klassen mit ein paar einschreckungen vom Hause...

    Trotzdem danke für deinen Tip, ich bin gerade sowieso dabei, mich immer weiter vom BC++ zu entfernen..aber wenn man das ganze geschäftlich nutzt, dann spielt der Zeitfaktor auch eine wichtige Rolle...da ist VCL doch ein sehr guter Punkt, um einzusparen..

    Ansich eine interessante Diskussion 🙂

    danke



  • Hi

    Du hast es zwar gelöst jetzt, es gäbe aber noch eine Alternative. Du könntest es mit einem Modul für Reguläre Ausdrücke machen. Es gibt eine ganz gut Komponente für den BCB die unter anderem auch ein Perl- s/old/new/ -equivalent und Split anbietet. Damit bräuchtest du wesentlich weniger Code.

    //------- snip ----- 
    TStringList *list=new TStringList;
    TStringList *upper=new TStringList;
    RegEx->StringToMatch=Edit1->Text;
    RegEx->Split(*list);
    RegEx->Expression="^[A-Z].*";
    for(int i=0;i<list->Count;i++){
        RegEx->StringToMatch=list->Strings[i];
        if(RegEx->Match()){
              upper->Add(list->Strings[i]);
        }
    }
    //-------- snap --------
    


  • maYer schrieb:

    Machst du das der Kompatibilität wegen oder bist du konservativ 😉 ?

    Ich denke, er ist eher effizient. Hätte ich auch so gemacht, denn mit char-Zeigern zu arbeiten ist sicherlich schneller als mit AnsiString.



  • naja wobei Peter mal wieder die Regeln zur Verwendung von AnsiString::c_str() verletzt hat... (o;

    -junix



  • Junix, ich glaub wir verstehn uns 😉



  • Prolog wo kommt den das RegEx her ?
    welche datei includen ?

    danke


Anmelden zum Antworten