Suche im Text nach Wörtern die mit einem Großbuchstaben -> Wie
-
Hallo,
ich will einen Text nach Wörtern mit einem vorangehendem Großbuchstaben beginnen. Also : Apfel, Pferd ..
Diese sollen dan extrahiert werden. hat jemand eine effektive Lösung ? danke
-
Also klar kenne ich isupper()...
aber kennt jemand eine elegantere Lösung..sonst muss ich erst alle Wörter und dann alle anfangsbuchstaben extrahieren...dann entsprechen checken...
danke
-
Was meinst du mit extrahieren? Ausschneiden?
-
Eigentlich rech simpel, folgender satz:
" Dies ist ein Satz, an dem ich das Beispiel erklären möchte"
in meiner result soll nachher stehen :
Satz
Beispiel->Großgeschriebn
Danke
-
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