Autor Beitrag
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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:

  1. Alle Leerzeichen durch Tiefstriche ersetzen
  2. 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Sa 07.07.12 22:38 
Hallo Terra23,
user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
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.
ausblenden Delphi-Quelltext
1:
for i:=1 to length(s) do if s[i]=' ' then s[i]:='_';					

user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Sa 07.07.12 23:00 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Sa 07.07.12 23:06 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
While Pos(' ', S) > 0 Do
S[Pos(' ', S)] := '_';


Hab es jetzt aber für "Of" und die anderen Worte hinbekommen:

ausblenden Delphi-Quelltext
1:
S := StringReplace(S, ' Of'' of', [rfReplaceAll]);					


Danke für eure Hilfe, Jungs...

_________________
Hasta La Victoria Siempre
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 user profile iconNarses: Beiträge zusammengefasst

ausblenden 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..2of 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 08.07.12 00:06 
ja kann problemlos jederzeit erweitert werden, noch dynamischer wäre es beispielsweise mit einer einfachen Stringliste die in einer Datei abgelegt werden könnte:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Function GetReplaced(const s:String):String;
var
  i:Integer;
  sl:TStringList;
begin
  sl:=TStringList.Create;
  try
  sl.LoadFromFile(ChangeFileExt(Application.ExeName,'.lst'));
  Result := StringReplace(s,' ','_',[rfReplaceAll]);
  for I := 0 to sl.Count -1 do
    Result := StringReplace(Result,'_'+sl[i]+'_','_'+Lowercase(sl[i])+'_',[rfReplaceAll]);

  Finally
    sl.Free;
  end;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Showmessage(GetReplaced('The Winged Dragon Of Ra'));
end;


in dem Beispiel mit einer Datei in Ordner der Exe Exename.lst mit Inhalt
ausblenden Quelltext
1:
2:
3:
Of
In
The

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: 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