Autor |
Beitrag |
Terra23
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Sa 07.07.12 22:24
Hi Leute!
Ich habe folgendes Problem:
Ich habe einen Namen in einer String-Variablen (S), z.B. den Namen "Allure Of Darkness".
Nun möchte ich gern den String durchgehen und folgendes tun:
- Alle Leerzeichen durch Tiefstriche ersetzen
- Bestimmte Worte, z.B. "Of" oder "In" oder "The", sofern sie nicht am Anfang des Wortes stehen kleinschreiben, d.h. aus "Of" wird "of" aus "In" wird "in" usw...
Das Ersetzen der Leerzeichen durch Tiefstriche würde ich sicherlich noch irgendwie hinbekommen (wahrscheinlich allerdings mit mehr Code als eigentlich nötig wäre) aber die zweite Aufgabenstellung bereitet mir Probleme.
Kann mir da jemand mit Suchbegriffen oder so behilflich sein? Ich weiß leider nicht, wie ich das programmieren soll bzw. wonach ich suchen soll.
Gruß,
Terra
_________________ Hasta La Victoria Siempre
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Sa 07.07.12 22:38
Hallo Terra23,
Terra23 hat folgendes geschrieben : | Alle Leerzeichen durch Tiefstriche ersetzen |
Das dürfte nicht allzu schwer sein, da jedes Zeichen mit dem Index i des Strings s mit s[i] angesprochen werden kann, z.B.
Delphi-Quelltext 1:
| for i:=1 to length(s) do if s[i]=' ' then s[i]:='_'; |
Terra23 hat folgendes geschrieben : | Bestimmte Worte, z.B. "Of" oder "In" oder "The", sofern sie nicht am Anfang des Wortes stehen kleinschreiben, d.h. aus "Of" wird "of" aus "In" wird "in" usw... |
Mit n:=pos(' Of ',s) wird der Index n des ersten Auftretens von " Of " (mit Leerzeichen!) im String genannt. Dann müsstest Du s[n+1] gleich 'o' setzen. Da nach ' Of ' und nicht nach 'Of' gesucht wird, steht dein Wort auch nicht am Anfang.
Nach der 1.Tauschaktion wird erneut gesucht (while-Schleife) bis n=0 ist, d.h. das Wort ' Of ' nicht mehr in dieser Großschreibweise auftritt.
Danach alles noch einmal mit ' In ' und ' The ' usw.
Solltest Du erst die Leerzeichen durch '_' ersetzen, musst Du natürlich nach '_Of_' usw. suchen.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Sa 07.07.12 22:39
ad 1 . StringReplace
ad 2 . was meinst Du mit am Anfang eines Worte (anfange eines Satzes?)
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Sa 07.07.12 22:51
@Beide: Danke für die Tipps. Für das Ersetzen der Leerzeichen habe ich schon was gefunden im Programm "EasyHelper".
@Mathematiker: Stimmt, du hast Recht. Wenn ein Leerzeichen vor dem "Of" steht, kann es ja nicht am Wortanfang stehen. Ich probiere es mal.
@bummi: Wenn der String z.B. heißt "The Winged Dragon Of Ra" (es geht in dem Programm um Sammelkartenspiele), dann soll er das "The" nicht kleinschreiben, da es direkt am Anfang vom String steht. Das "Of" in diesem String soll er allerdings dann kleinschreiben, da es im String steht.
Gruß,
Terra
_________________ Hasta La Victoria Siempre
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Sa 07.07.12 23:00
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var s:String; begin s :='The Winged Dragon Of Ra'; s := Lowercase(StringReplace(s,' ','_',[rfReplaceAll])); s[1] := Uppercase(S)[1]; Showmessage(s); end; |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Sa 07.07.12 23:06
bummi hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var s:String; begin s :='The Winged Dragon Of Ra'; s := Lowercase(StringReplace(s,' ','_',[rfReplaceAll])); s[1] := Uppercase(S)[1]; Showmessage(s); end; | |
Damit macht er aber alle Worte klein, außer dem, das am Anfang steht. Er soll ja nur die Worte "Of", "In", "The" kleinschreiben.
Die Leerzeichen ersetze ich durch diesen Code:
Delphi-Quelltext 1: 2:
| While Pos(' ', S) > 0 Do S[Pos(' ', S)] := '_'; |
Hab es jetzt aber für "Of" und die anderen Worte hinbekommen:
Delphi-Quelltext 1:
| S := StringReplace(S, ' Of', ' of', [rfReplaceAll]); |
Danke für eure Hilfe, Jungs...
_________________ Hasta La Victoria Siempre
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Sa 07.07.12 23:11
Genau da hatte ich die Probleme erwartet, was sollen denn die Entscheidungskriterien dafür sein was groß bleiben, oder klein geschrieben werden soll (? eine Liste mit Worten). Moderiert von Narses: Beiträge zusammengefasst Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm2.Button1Click(Sender: TObject); Const C_REPL:Array[0..2] of String=('Of','In','The'); var s:String; i:Integer; begin s :='The Winged Dragon Of Ra'; s := StringReplace(s,' ','_',[rfReplaceAll]); for I := low(C_REPL) to High(C_REPL) do s := StringReplace(s,'_'+C_REPL[i]+'_','_'+Lowercase(C_REPL[i])+'_',[rfReplaceAll]);
Showmessage(s); end; |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Sa 07.07.12 23:17
Ja, es geht, wie bereits gesagt, um bestimmte Worte wie eben "Of", "In" oder "The".
Ich erkläre es mal kurz:
Mein Programm soll per Klick auf einen String auf eine Website verlinken. Das Problem ist, dass in meinem Programm zwar alle Strings englisch sind, aber die Worte alle groß beginnen.
Nehmen wir wieder das Beispiel: The Winged Dragon Of Ra
Wenn ich nun auf die Website verlinken will, muss ich zuerst mal das Wort "Of" klein schreiben und dann die Leerzeichen entfernen, da die Website anders nicht aufzurufen wäre.
Wenn ich den String nun verändert habe, heißt er: The_Winged_Dragon_of_Ra
Und nun kann ich auch die Website aufrufen und lande hier:
Klick
Ich muss den String also zum Aufruf der Website der Website entsprechend anpassen. Und die arbeitet nunmal so, dass bestimmte Worte innerhalb eines Namens klein geschrieben sind. Wenn ich das "Of" groß lasse, kann ich die Seite nicht aufrufen...
Gruß,
Terra Moderiert von Narses: Beiträge zusammengefasst@Bummi: Auch wenn ich deinen Array-Code nicht kapiere (hab Arrays noch nie kapiert), funktioniert es tadellos und ersetzt alles gleichzeitig, also die Worte werden klein und die Leerzeichen zu Tiefstrichen.
Ich sehe das richtig, dass ich nun, falls da irgendwann weitere Worte auffallen, die von der Website klein verlangt werden, diese Worte im Array ergänzen kann?
Gruß,
Terra
_________________ Hasta La Victoria Siempre
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: So 08.07.12 00:06
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 08.07.12 00:08
Vielen Dank euch beiden. Nun muss ich nur noch einen Weg finden, das Kartenbild einer jeden Seite bei Bedarf in ein Image laden zu können. Habe mir schon die Indy-Komponenten geladen und morgen suche ich mal ein wenig.
Gruß,
Terra
_________________ Hasta La Victoria Siempre
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: So 08.07.12 00:24
Moin,
also dass es dieses Yu-Gi-Oh noch gibt, verwundert mich aber schon, das war ja das letzte mal modern, als ich in der 5./6. Klasse war. Aber na ja, zurück zum Thema:
Was spricht denn als Alternative, das Problem über die Suche zu erschlagen? Dann muss man intern nicht immer mit den Daten herumfiddeln.
LG
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 08.07.12 18:06
Hi!
Nein, die YGO-Community boomt wie verrückt; das Spiel ist beliebter als je zuvor. Aber zum Thema:
Ich verstehe deinen Satz nicht, "das Problem mit der Suche zu erschlagen". Kannst du mir das erklären?
_________________ Hasta La Victoria Siempre
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: So 08.07.12 22:58
Moin,
na ja, du könntest case-insensitiv einfach die Suche des Wikis benutzen und dann den ersten Treffer auswerten.
yugioh.wikia.com/wik...&fulltext=Search
Wenn du die Seite eh ausliest... Kann aber u.U. auch umständlicher sein - schade, dass die Seite keine "auf gut Glück"-Funktion bereitstellt.
LG
|
|
|