Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Beliebigkeitssymbol? (https://www.delphipraxis.net/123420-beliebigkeitssymbol.html)

MaToBe 1. Nov 2008 16:06


Beliebigkeitssymbol?
 
Hallo

ich will mit folgendem Code

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  MemoIniShow.Lines[0] :=StringReplace(MemoIniShow.Lines[0], ('[' + * +  ']') , '0', [rfReplaceAll]);
end;
alle Zeichen, die eingeklammert sind (zB [ Test123 ] ) aus meinem Memo mit 0 ersetzen. Ich habe dies mit einem "Beliebigkeitszeichen" versucht, aber leider klappt das nicht.
Gibt es ein anderes "Beliebigkeitszeichen" oder muss man das Problem anders lösen?

MFG

Apollonius 1. Nov 2008 16:08

Re: Beliebigkeitssymbol?
 
Mit Delphi-eigenen Mitteln ist es nicht ganz trivial, es liefe auf eine Verbindung von PosEx und Copy hinaus. Weit eleganter geht es aber sicherlich mit Regulären Ausdrücken.

MaToBe 1. Nov 2008 16:10

Re: Beliebigkeitssymbol?
 
was meinst du mit Regilären Ausdrücken ? Feste Bezeichnungen wie Haus, Garten und Schippe ?

EEs steht aber in jeder Klammer etwas anderes.

3_of_8 1. Nov 2008 16:16

Re: Beliebigkeitssymbol?
 
http://de.wikipedia.org/wiki/Regulärer_Ausdruck

MaToBe 1. Nov 2008 16:53

Re: Beliebigkeitssymbol?
 
muss ich da wirklich wieder ne extra Komponente installieren?

Die Muhkuh 1. Nov 2008 16:59

Re: Beliebigkeitssymbol?
 
Ja

3_of_8 1. Nov 2008 17:05

Re: Beliebigkeitssymbol?
 
Müsste reichen, sich ne entsprechende Unit zu suchen und die einzubinden.

bigben37 1. Nov 2008 19:34

Re: Beliebigkeitssymbol?
 
Ich hab jetzt mal schnell ne Funktion geschrieben:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := ReplaceArea(Edit1.Text, '[', ']', '0');
end;

function TForm1.ReplaceArea(CurrentS, FromS, ToS, ReplcS: string): string;
var
  FromSPos, ToSPos: Integer;
begin
  result := '';
  FromSPos := Pos(FromS, CurrentS);
  ToSPos := Pos(ToS, CurrentS);
  while (FromSPos > 0) and (ToSPos > 0) do
    begin
      Delete(CurrentS, FromSPos, ToSPos - FromSPos + Length(ToS));  
      Insert(ReplcS, CurrentS, FromsPos);
      FromSPos := Pos(FromS, CurrentS);
      ToSPos := Pos(ToS, CurrentS);
    end;
  result := CurrentS;
end;
Wurde das so gehen?

alzaimar 1. Nov 2008 19:48

Re: Beliebigkeitssymbol?
 
Benjamin, besorg Dir eine RegularExpression-Klasse und verwende die. Reguläre Ausdrücke sind so fundamental, Du wirst, sofern Du dich weiter mit Softwareentwicklung beschäftigst nicht darum herum kommen. Je eher Du das drauf hast, desto besser.

bigben37 1. Nov 2008 21:29

Re: Beliebigkeitssymbol?
 
Ok, werd ich machen, fange gleich morgen an...

Kannst Du mir irgend eine Seite empfehlen?

MFG, Benjamin

3_of_8 1. Nov 2008 21:36

Re: Beliebigkeitssymbol?
 
In dem Wikipediaartikel sind mehrere gute verlinkt - und der Artikel selbst erklärt es auch recht gut.

Meflin 1. Nov 2008 22:42

Re: Beliebigkeitssymbol?
 
Zitat:

Zitat von bigben37
Kannst Du mir irgend eine Seite empfehlen?

http://www.regular-expressions.info/tutorial.html ;)

MaToBe 2. Nov 2008 12:09

Re: Beliebigkeitssymbol?
 
mmh hat vielleicht jemand noch ne seite, wo man diese Unit/Komponente herunterladen kann?

Auch wenn ich weiß das die Computersprache und die Tutorials dazu in Englisch sind hätt ich gern ein Deutsches wenns irgendwie machbar ist.

MFG

omata 2. Nov 2008 12:18

Re: Beliebigkeitssymbol?
 
klick

Beispiel...
Delphi-Quellcode:
function Replace(Input:string):string;
var RegExpr:TRegExpr;
begin
  RegExpr:=TRegExpr.Create;
  try
    RegExpr.ModifierG:=false;
    RegExpr.Expression:='(\[.*\])';
    Result:=RegExpr.Replace(Input, '0', false);
  finally
    RegExpr.free;
  end;
end;

Jakob Ullmann 2. Nov 2008 12:46

Re: Beliebigkeitssymbol?
 
Zitat:

Delphi-Quellcode:
    RegExpr.ModifierG:=false;

warum diese Zeile? :gruebel:

omata 2. Nov 2008 13:10

Re: Beliebigkeitssymbol?
 
Die Zeile schlatet auf "nicht gierig" um.
Dies ist wichtig, damit bei mehrfachem Vorkommen von "[ bla ]" auch alle für sich zu einer "0" werden.

Aber das hättest du auch einfach ausprobieren können.

3_of_8 2. Nov 2008 13:11

Re: Beliebigkeitssymbol?
 
Okay...

Pattern: \[.*\]
String: [wuppdi]blabla[narf]

Mit Greedy-Modifier: 1 Match: [wuppdi]blabla[narf]
Ohne Greedy-Modifier: 2 Matches: [wuppdi] und [narf]

Der Greedy-Modifier sorgt dafür, dass jedes Pattern sich so viel Text wie möglich schnappt. Ohne Greedy wird versucht, so wenig Text wie möglich pro Match zu nehmen.

MaToBe 2. Nov 2008 13:13

Re: Beliebigkeitssymbol?
 
supper danke hat perfekt funktioniert :-D :cheers:

MaToBe 3. Nov 2008 11:40

Re: Beliebigkeitssymbol?
 
Delphi-Quellcode:
function Replace(Input:string):string;
var RegExpr:TRegExpr;
begin
  RegExpr:=TRegExpr.Create;
  try
    RegExpr.ModifierG:=false;
    RegExpr.Expression:='(\[.*\])';
    Result:=RegExpr.Replace(Input, '', false);
  finally
    RegExpr.free;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  MemoIniShow.Lines[0] := Replace(MemoIniShow.Lines[0]);
end;
es gibt leider doch noch ein Problem.

Es werden immer 6[*] auf einmal gelöscht. Das bedeutet für mich, dass wenn in einem Text 20x[*] vorkommt, dass ich 4 mal auf den Butto1 klicken muss. Nach dem 10-15 mal drücken allerdings führt er keinen Replace mehr aus, obwohl ich auf den Button drücke und noch[*] Stellen vorhanden sind.

Woran liegt das?

MaToBe 4. Nov 2008 14:34

Re: Beliebigkeitssymbol?
 
Zitat:

Zitat von MaToBe
Delphi-Quellcode:
function Replace(Input:string):string;
var RegExpr:TRegExpr;
begin
  RegExpr:=TRegExpr.Create;
  try
    RegExpr.ModifierG:=false;
    RegExpr.Expression:='(\[.*\])';
    Result:=RegExpr.Replace(Input, '', false);
  finally
    RegExpr.free;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  MemoIniShow.Lines[0] := Replace(MemoIniShow.Lines[0]);
end;
es gibt leider doch noch ein Problem.

Es werden immer 6[*] auf einmal gelöscht. Das bedeutet für mich, dass wenn in einem Text 20x[*] vorkommt, dass ich 4 mal auf den Butto1 klicken muss. Nach dem 10-15 mal drücken allerdings führt er keinen Replace mehr aus, obwohl ich auf den Button drücke und noch[*] Stellen vorhanden sind.

Woran liegt das?

Kann mir das bitte jemand erklären? Würd auch gern verstehn wo der Fehler liegt.

3_of_8 4. Nov 2008 22:34

Re: Beliebigkeitssymbol?
 
Dir ist klar, dass dein Code so nur die erste Zeile ersetzt?

Für das von dir beschriebene Verhalten habe ich aber keine Erklärung.

EDIT: Ich habe es mit genau dem gleichen Code - nur statt MemoIniShow.Lines[0] eben MemoIniShow.Text - ausprobiert, und es funktioniert perfekt.

MaToBe 5. Nov 2008 10:49

Re: Beliebigkeitssymbol?
 
jo das wars, danke

ich bin immer nur von einer Zeile in meinem Memo ausgegangen, weil eigentlich alles in die Zeile 0 per SelText geschrieben wird. Danke nochma


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 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