Erstellen Sie eine Ersetzungsfunktion für Zeichenfolgen in Delphi
Anmerkung des Herausgebers: Tatsächlich ist die StringReplace-Funktion von Delphi speziell dafür konzipiert, diesen Bedarf zu erfüllen. Aber wir veröffentlichen diesen Artikel auch – zumindest liefert der Autor eine Alternative, und der Entdeckergeist soll gefördert werden! Dies ist mein erster Artikel hier, und da mein Niveau nicht sehr hoch ist, werde ich ein grundlegendes, aber sehr praktisches Problem besprechen. Ich hoffe, es kann Ihnen etwas helfen. Freunde, die VB oder ASP verwendet haben, wissen, dass es in VB eine sehr praktische Ersetzungsfunktion gibt. Ihre Funktion besteht darin, die Zeichenfolge, die mit der Teilzeichenfolge übereinstimmt (auch Musterzeichenfolge genannt), in einer Zeichenfolge durch die angegebene Zeichenfolge zu ersetzen. Es gibt zum Beispiel eine solche Zeichenfolge: s:='apple is apple!' Nach Verwendung der Ersetzungsfunktion zum Ersetzen von (s,'apple','box') wird s zu 'box is box!'. Auch die Länge der Zeichenfolge ändert sich entsprechend. Dies ist eine sehr nützliche Funktion, die häufig bei der Entwicklung von Datenbanksystemen verwendet wird. Diese Anweisung reagiert empfindlich auf bestimmte Zeichen, z. B. einfache Anführungszeichen werden in Quadrat verwendet l) Das Programm verursacht unerwartete Fehler und kann sogar von anderen verwendet werden, um schwerwiegende Sicherheitslücken im System zu verursachen (dies ist der berühmte SQL-Injection-Angriff, ich glaube, jeder erinnert sich noch daran, was zuvor im CSDN-Forum entdeckt wurde). Dies ist eine Lücke ). Zu diesem Zeitpunkt müssen Sie die einfachen Anführungszeichen während des Datenbankbetriebs durch andere Zeichenfolgen oder leere Zeichenfolgen ersetzen und sie dann beim Lesen der Daten wieder ersetzen, damit die einfachen Anführungszeichen fehlerfrei im Datensatz aufgezeichnet werden können. Allerdings habe ich in Delphi keine ähnliche Funktion gefunden (vielleicht habe ich sie nicht gefunden?), was wirklich unpraktisch war, also habe ich selbst eine geschrieben, die in der zukünftigen Datenbanksystementwicklung viel praktischer sein wird. Nachdem ich so viel Unsinn geredet habe, hier ist der Code, der mit Kommentaren leichter zu verstehen sein sollte.
PROcedure replace(var s:string;const SourceChar:pchar;const RChar:pchar); // Der erste Parameter ist die Originalzeichenfolge, der zweite ist die Musterzeichenfolge und der dritte ist die Ersatzzeichenfolge var ta,i,j: Ganzzahl ; m,n,pn,sn:integer; SLen,SCLen,RCLen:integer;//SLen stellt die Länge der Originalzeichenfolge dar, SCLen stellt die vom Modus übergebene Länge dar, RCLen stellt die Länge der Ersatzzeichenfolge dar IsSame:integer; // Wird verwendet, um Speichern Sie das ersetzte Zeichenarray begin SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar); j:=pos(string(SourceChar),s); s:=s+chr(0);ta:=0;i:=j; while s[i]<>chr(0) do // Diese Schleife verwendet ta zählt, wie oft die Musterzeichenfolge in der Originalzeichenfolge vorkommt begin n:=0;IsSame:=1; for m:=i to i+SCLen-1 do begin if m>SLen then begin IsSame:=0;break ;
Ende ; s[m]<>sourceChar[n] then begin IsSame:=0;end n:=n+1 ; if IsSame=1 then begin ta:=ta+1;i:=m; i:=i+1; end; if j>0 then begin pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// Weisen Sie die Länge von newp zu, +1 bedeutet, dass dahinter ein #0
-Terminator steht , während s[sn]<>chr(0) dies tut // Hauptsächlich Schleife, beginnen Sie mit dem Ersetzen von begin n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do // Vergleichen Sie, ob die Teilzeichenfolge mit der Musterzeichenfolge übereinstimmt begin if m>SLen then begin IsSame:=0;break; end; if s[m]<
> sourceChar
[ n] then begin IsSame:=0; break end ; m:=0 bis RCLen-1 do begin newp[pn]:=RChar[m];pn:=pn+1 ; end else begin ; // Anders newp[pn]:=s[sn]; pn :
= pn+1; end ; / wird zurückgesetzt , Austausch abgeschlossen! Ende; Ende; Tatsächlich ist dies ein grundlegendes Problem der Datenstruktur. Wenn wir heute häufig mit Drag-and-Drop-Steuerelementen programmieren, sollten wir einfach die Datenstruktur üben. Natürlich ist diese Funktion nicht optimal geschrieben und es hat eine halbe Sekunde gedauert. Wenn Sie einen besseren Weg haben, besprechen Sie ihn bitte.