Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi StringReplace "String" durch "[b]String[/b]" ersetzen (https://www.delphipraxis.net/170684-stringreplace-string-durch-%5Bb%5Dstring%5B-b%5D-ersetzen.html)

QStorm 28. Sep 2012 12:47

StringReplace "String" durch "[b]String[/b]" ersetzen
 
Hallo,

Ich möchte ein Wort innerhalb einer Zeichenkette mit bestimmten Styleattributen umgeben. Dabei soll die Groß- und Kleinschreibung auf JEDEN FALL erhalten bleiben.

Beispiel:Wort: ich
Zeichenkette: Ich wusste, dass ich in diesem Punkt falsch lag.
Ersetzen durch: Ich wusste, dass ich in diesem Punkt falsch lag.

Momentan mache ich das mit StringReplace:
Code:
StringReplace(Caption, Highlight, ('[b]' + Highlight + '[/b]'), [rfReplaceAll, rfIgnoreCase])
Leider geht damit die ursprüngliche Groß- und Kleinschreibung verloren.

Fällt euch dafür eine geeignete Lösung ein? Gibt es vielleicht schon eine passende Methode dafür?

Vielen Dank im voraus.

/Steven

bernau 28. Sep 2012 12:53

AW: StringReplace "String" durch "[b]String[/b]" ersetzen
 
Du verwendetst "rfIgnoreCase".

Nimm diesen Parameter weg.

Allerdings musst du dann die funktion einmal mit "Ich" und einmal mit "ich" durchführen.

mkinzler 28. Sep 2012 12:54

AW: StringReplace "String" durch "[b]String[/b]" ersetzen
 
Schalt mal die Beachtung der Groß-/Kleinschreibung an

BUG 28. Sep 2012 13:10

AW: StringReplace "String" durch "[b]String[/b]" ersetzen
 
Dein Problem ist das folgende: StringReplace hat keine Möglichkeit, das gefundene Wort mit in die Ersetzung einzubeziehen.

Ich sehe 3 Lösungsvarianten:
  1. Case-Sensitives String-Replace mit möglichen Groß-/Kleinschreibungsvarianten.
    Das sind potenziell exponentiell viele, lassen sich sich vielleicht aber auf häufige Varianten eingrenzen: alles groß, nur Wortanfang groß, alles klein.
  2. Benutzung einer ordentlichen Bibliothek für reguläre Ausdrucke mit Unterstützung für Gruppen
  3. Selber programmieren.

1. ist wahlweise ineffizient oder ungenau, aber schnell implementiert.
2. bedeutet eine zusätzliche Bibliothek, ist aber effizient und einfach.
3. bedeutet Arbeit, ist aber ne saubere Lösung und stand-alone.

QStorm 28. Sep 2012 13:19

AW: StringReplace "String" durch "[b]String[/b]" ersetzen
 
Zitat:

Zitat von mkinzler (Beitrag 1184842)
Schalt mal die Beachtung der Groß-/Kleinschreibung an

Dann würde er bei "ich" jedoch nicht "Ich" ersetzen.

Popov 28. Sep 2012 13:24

AW: StringReplace "String" durch "[b]String[/b]" ersetzen
 
@QStorm

Ich hab lange mit Delphi 3 programmiert und das hatte kein StringReplace, also habe ich es mir selber programmiert. So eine Funktion kann man an seine Ansprüche modifizieren. Wenn du Interesse hast, sag Bescheid.

Bummi 28. Sep 2012 13:40

AW: StringReplace "String" durch "[b]String[/b]" ersetzen
 
Delphi-Quellcode:
Function Capsulate(From:String;const find,l,r:String):String;
var
 F,s:String;
 i,lf:Integer;
begin
   f := Lowercase(From);
   s := Lowercase(find);
   i := pos(s,f);
   while i>0 do
      begin
        Result := Result + Copy(From,1,i-1) +l + Copy(From,i,Length(find)) + r;
        From := Copy(From,i + length(find),length(From));
        f := Lowercase(From);
        i := pos(s,f);
      end;
   REsult := Result + From;
end;


procedure TForm3.Button1Click(Sender: TObject);
begin
    memo2.Text := Capsulate(memo1.Text,'ich','[b]','[/b]')
end;

allerdings wird nicht auch zu nicht, da müsstest Du noch eine Prüfung einbauen ...

QStorm 28. Sep 2012 14:01

AW: StringReplace "String" durch "[b]String[/b]" ersetzen
 
Zitat:

Zitat von Bummi (Beitrag 1184851)
Delphi-Quellcode:
Function Capsulate(From:String;const find,l,r:String):String;
var
 F,s:String;
 i,lf:Integer;
begin
   f := Lowercase(From);
   s := Lowercase(find);
   i := pos(s,f);
   while i>0 do
      begin
        Result := Result + Copy(From,1,i-1) +l + Copy(From,i,Length(find)) + r;
        From := Copy(From,i + length(find),length(From));
        f := Lowercase(From);
        i := pos(s,f);
      end;
   REsult := Result + From;
end;


procedure TForm3.Button1Click(Sender: TObject);
begin
    memo2.Text := Capsulate(memo1.Text,'ich','[b]','[/b]')
end;

allerdings wird nicht auch zu nicht, da müsstest Du noch eine Prüfung einbauen ...

Wunderbar, vielen Dank :)

P.S.: nicht auch zu nicht ist gewünscht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz