AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Allgemeines Replace mit zwei Masken

Ein Thema von glkgereon · begonnen am 27. Dez 2005 · letzter Beitrag vom 27. Dez 2005
Antwort Antwort
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 15:35
Hallo,

Ich suche im Moment einer Ersetzen-Funktion, der ich einen String und zwei Masken übergebe und die daraus einen neuen String "bastelt". Der erste String soll nach der ersten Maske analysiert werden und dann entsprechend in die zweite eingesetzt werden.

Beispiel:

String: 'DP ist toll'
Maske1: '%Forum% ist %Bewertung%'
Maske2: 'Der User findet %Forum% %Bewertung%'

heraus käme dann 'Der User findet DP toll'

gibt es sowas?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 15:47
warum lässt du nicht einfach 2 mal stringreplace drüber laufen?
Für Maske 1 wäre das ganze noch machbar aber für maske 2 ist das ganze unmöglich. Denn bei Maske 1 findet man das wort "ist" und kann aus deinem String das wort davor und danach nehmen. Aber für die Maske2 gibt es keine übereinstimmung woraus ersichtlich wäre welcher teil für "%Forum%" und welcher Teil für "%Bewertung%" steht. Das können nur inteligente Wesen wissen die auch wissen das DP ein forum ist und toll eine Bewertung.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#3

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 15:52
nein, das ganze soll so gehen (Pseudocode):

Delphi-Quellcode:
function AdvReplace(Value,Mask1,Mask2: String):String;
var Vars: TVars;
begin
  Vars:=StoreVars(Value,Mask1);
  Result:=InsertVars(Vars,Mask2);
end;
also bei dem Beispiel
String: 'DP ist toll'
Maske1: '%Forum% ist %Bewertung%'
Maske2: 'Der User findet %Forum% %Bewertung%'

wäre dann

Vars:
%Forum% = DP
%Bewertung% = toll

und beim einsetzen wäre dann wieder %Forum% = DP und %Bewertung% = toll und der String 'Der User findet DP toll'

also die Maske1 soll auf den String angewendet werden, und diese Variablen rausgeholt werden, und in die zweite Maske eingesetzt werden.
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Waldteufel
(Gast)

n/a Beiträge
 
#4

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 15:59
Hi Gereon.

Ich rate dir in diesem Fall zu regulären Ausdrücken. Ich habe momentan leider keine Unit zur Hand, aber ich weiß, dass es RegExp-Units für Delphi gibt.

Der Code würde dann etwa so aussehen.

Delphi-Quellcode:
function ForumsBewertung(s : string) : string;
var
  r : TRexExp;
begin
  r := TRegExp.Create('^(.*?) ist (.*?)$'); // Muster anlegen
  r.Match(s); // StoreVars()
  result := 'Der User findet ' + r.Matches[1] + ' ' + r.Matches[2] + '!'; // InsertVars()
  r.Free;
end;

{...}

var
  s1, s2 : string;
begin
  s1 := 'DP ist toll';
  s2 := ForumsBewertung(s1);
  ShowMessage(s2); // Zeigt 'Der User findet DP toll!' an
end.
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#5

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 16:19
Ich habe nun folgende Unit hier gefunden bei torry.

Aber was mache ich nun damit?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 16:22
Installieren und Waldteufels Code benutzen ?
Die richtige Webseite ist übrigens http://regexpstudio.com/TRegExpr/TRegExpr.html.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#7

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 16:42
habs nun so:

Delphi-Quellcode:
var R: TRegExpr;
begin
  R:=TRegExpr.Create;
  R.Expression:='^(.*?) ist (.*?)$';
  R.InputString:=Edit1.Text;
  R.Compile;
  Edit2.Text := 'Der User findet ' + r.Match[1] + ' ' + r.Match[2] + '!';
  R.Free;
end;
Aber es kommt bei 'DP ist toll' immer 'Der User findet !'

Edit:
ausserdem möchte ich das einsetzen ja auch wieder dynamisch machen, das heisst mithilfe der zweiten Maske
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 17:36
Hier ein Beispiel, nach Delphi musst du es aber allein übersetzen .
Code:
void TextBox1TextChanged(object sender, System.EventArgs e)
{
   string s = null;
   
   try {
      Regex regex = new Regex(textBox1.Text);
      Match match = regex.Match(textBox2.Text);
      s = textBox3.Text;
      foreach (string groupname in regex.GetGroupNames()) {
         s = s.Replace('%' + groupname + '%', match.Groups[groupname].Value);
      }
   }
   catch {
      s = null;
   }
   
   label1.Text = s;
}
Miniaturansicht angehängter Grafiken
regex_789.png  
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#9

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 17:48
es fängt ja schon damit an, das Create bei mir keine Parameter hat^^

Delphi-Quellcode:
procedure OnEditChange(Sender: TObject);
var S: String;
    R: TRegExpr;
begin
  try
    R:=TRegExpr.Create;
    R.Expression:=Edit1.Text;
    R.InputString:=Edit2.Text;
    S:=Edit3.Text;
    
// foreach (string groupname in regex.GetGroupNames()) {
// S:=StringReplace(S,'%'+groupname+'%',match.Groups[groupname].Value,[rfReplaceAll]);
// }
  except
    S:='';
  end;
  Label1.Caption:=Ss;
end;
könnte vielleicht einer von euch mal seine RegExpr-Version anhängen?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#10

Re: Allgemeines Replace mit zwei Masken

  Alt 27. Dez 2005, 18:12
Also...

Mein Fehler war, das ich das Exec vergessen hatte^^ funzt jetzt.

Nun habe ich noch folgende Funktion geschrieben, um eine Maske mit einfacher %Platzhalter% Syntax RegExpr-kopatibel zu machen und gleichzeitig (für den zweiten schritt, das einsetzen in die zweite Maske, eine Tabelle ID:Variable anzulegen)

Delphi-Quellcode:
  TData = record
    Name: String;
    ID: Integer;
  end;
  TDataTable = array of TData;

function Mask2RegExp(Mask: String; var Table: TDataTable):String;
var Akt, ID: Integer;
    S, R: String;
begin
  SetLength(Table,0);
  S:=Mask;
  Akt:=Pos('%',S);
  ID:=1;
  R:='';
  while Akt>0 do
    begin
    SetLength(Table,Length(Table)+1);
    Table[Length(Table)-1].ID:=ID;
    R:=R+Copy(S,1,Akt-1);
    Delete(S,1,Akt);
    Table[Length(Table)-1].Name:=Copy(S,1,Pos('%',S)-1);
    R:=R+'(.*?)';
    Delete(S,1,Pos('%',S));
    Akt:=Pos('%',S);
    Inc(ID);
    end;
  if R[1]='(then R:='^'+R;
  R:=R+S;
  if Length(S)=0 then R:=R+'$';
  Result:=R+S;
end;
oder geht das auch einfacher?

Die Einsetzen-funktion sieht nun wie folgt aus:
Delphi-Quellcode:
function InsertIntoString(Mask: String; Table: TDataTable; R: TRegExpr):String;
var i:Integer;
    S: String;
begin
  S:=Mask;
  for i:=0 to Length(Table)-1 do
    S:=StringReplace(S,'%'+Table[i].Name+'%',R.Match[Table[i].ID],[rfReplaceAll]);
  Result:=S;
end;
So wird aus
Value: DP ist toll
Mask1: %wer% ist %wie%
Mask2: Angeblich ist %wer% %wie%
dann endlich: Angeblich ist DP toll

JUHUHUUUUU

ich bastel das noch schön in ne Klasse, und dann kommst in die CodeLib^^
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 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