Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speziellen Substring aus String kopieren (https://www.delphipraxis.net/136167-speziellen-substring-aus-string-kopieren.html)

13Horst37 24. Jun 2009 22:51


Speziellen Substring aus String kopieren
 
Hallo zusammen!

Ich (Delphi-Anfänger :P), versuche seit 3 Stunden aus einem (sehr langen) String einen speziellen Substring zu kopieren. Problem an der ganzen Sache: Der Substring ist nie gleich. Noch dazu komm ich mit Copy und Pos nicht so klar wie ich es gerne hätte :)

Beispiel:

In String "Haupt" befindet sich der gesuchte Substring "Unbekannt". Das einzige was über diesen Substring bekannt ist, ist folgendes:
Er befindet sich 1 Stelle nach dem Substring "Edit1.text".

Dies ändert sich nie, dennoch ist der gesuchte Substring bei meinem Projekt niemals der Gleiche.

Wie zum Teufel schaffe ich es, diesen String herauszufinden?
Die einzige Information ist, wie gesagt, der andere Substring vor dem gesuchten Substring, nichtmal die Position ist immer die Gleiche.

So hab ich es probiert - erfolglos:

Delphi-Quellcode:
SubStr1 := Pos (x,s);  // x = bekannter Substring, s = "Haupt"
SubStr2 := Copy (s, Substr1+1,7);
ShowMessage(SubStr2)
Selbst wenn der Code funktionieren würde, wäre ich noch unzufrieden damit, da auch er seine Funktion nicht wirklich erfüllen kann: Die Länge des gesuchten Substrings ist ebenfalls unbekannt, die 7 im Code ist blos, damit ich überhaupt ein Ergebnis bekomme.

Nochmal die Fakten über den unbekannten Substring:
- Niemals der gleiche
- Immer unterschiedlich lang
- Position im String nie gleich
- allerdings immer nach Substring "Edit1.text"
- Gesuchter SubString endet bei nächstem Leerzeichen

Ich hoffe das ganze war jetzt nicht zu verwirrend...
Danke im Vorraus an alle, die sich die Mühe machen mir zu helfen!

Fridolin Walther 24. Jun 2009 22:59

Re: Speziellen Substring aus String kopieren
 
Zitat:

Zitat von 13Horst37
- Immer unterschiedlich lang

Gibts irgend einen Hinweis, wann der String zu Ende ist?

Popov 24. Jun 2009 23:10

Re: Speziellen Substring aus String kopieren
 
Dir als Anfänger würde ich noch die Prozedur Delete enpfehlen. Sie hat die gleichen Parameter wie Copy. Zwar kann man alles mit Copy machen, aber als Anfänger kann man sich das leichter machen.

Außerdem würde ich dir empfehlen mit einem Temporär-String zu arbeiten, also einer Kopie deines eigentlichen Strings. Dann kannst du dein Temporär-String auch zerlegen ohne dein eigentlichen String zu zerstören.

Also

Delphi-Quellcode:
var
  ...
  sTemp: String;
begin
  ...
  sTemp := s;

  Delete(sTemp, 1, Pos(x,sTemp) + 1); // entfernt alles bis zu der Such-Position und ein Zeichen mehr

  SubStr2 := Copy (sTemp, 1, Pos(' ', sTemp)); // kopiert alles bis zum nächsten Leerzeichen

  ShowMessage(SubStr2)
//

EDIT:

Ich hab bemerkt, daß ich den Beitrag missverstanden habe. Ich bearbeite meine Antwort noch mal.

EDIT2:

Ich glaube es war doch richtig. Wenn nicht, dann bessere ich es aus. Die ganzen bekannte und unbekannte Substrings bringen mich irgendwie durcheinander. Am besten ein Text als Beispiel, dann wäre das einfacher.

Fridolin Walther 24. Jun 2009 23:13

Re: Speziellen Substring aus String kopieren
 
Oder man lagert die Funktionalität direkt in eine Funktion aus, weshalb man dank Call By Value ohnehin eine "eigene Kopie" hat die man lustig zerstückeln kann wie man will ;).

13Horst37 24. Jun 2009 23:17

Re: Speziellen Substring aus String kopieren
 
Zitat:

Zitat von Fridolin Walther
Zitat:

Zitat von 13Horst37
- Immer unterschiedlich lang

Gibts irgend einen Hinweis, wann der String zu Ende ist?

Ja, der String ist beim nächsten Leerzeichen zuende, also eine (willkürliche) Kette von Buchstaben und Zahlen.

Zu Popov:

Der String kann ruhig zerstückelt werden, den brauch ich danach nicht mehr :)

Grüße

Edit1 für Popov:

Also, gesucht ist SubString "Unbekannt" im String "Unwichtig".
Einziges Indiz: "Unbekannt" steht immer direkt nach dem bekannten Substring "Bekannt", und endet mit einem Leerzeichen.

Ziel des Ganzen: "Unbekannt" soll in eine Variable / einen String extrahiert werden.

Reicht das, oder was genau hast du nicht verstanden?

Grüße

Popov 24. Jun 2009 23:34

Re: Speziellen Substring aus String kopieren
 
Zitat:

Zitat von 13Horst37
Also, gesucht ist SubString "Unbekannt" im String "Unwichtig".
Einziges Indiz: "Unbekannt" steht immer direkt nach dem bekannten Substring "Bekannt", und endet mit einem Leerzeichen.

Eigentlich nicht, denn deine "Unbekannt", "Unwichtig" und "Bekannt" String-Beispiele sind das verwirrende.

Mach es doch einfacher:

Gesucht wird SubString im String. Einziges Indiz: der unbekannte SubString steht immer direkt nach dem bekannten SubString und endet mit einem Leerzeichen.

Ist es das was du willst?

Fridolin Walther 24. Jun 2009 23:35

Re: Speziellen Substring aus String kopieren
 
Nunja, prinzipiell würde das ganze so aussehen:

Du suchst mit Pos den String "Edit1.text" in deinem String.
Sobald Du die Position hast, löscht Du mit Delete vom Anfang des Strings bis zur gefundenen Position + 9 (Edit1.Text ist 10 Zeichen lang, aber das E ist von der gefundenen Position schon "inkludier") alle Zeichen im String.
Jetzt beginnt der bearbeitete String mit dem gewünschten variablen String. Allerdings hängt da ja jetzt wie Du meintest noch jede Menge Gewusel hinten dran.
Entsprechend ist der nächste Schritt jetzt, das abschließende Leerzeichen zu finden mit Pos und von dieser Position aus den Rest ebenfalls zu löschen.
Dadurch hast Du den gesuchten String Quasi aus dem Original String "herausgeschnitten".

Hier ist auch eine Demonstration wie das implementiert werden könnte. Ich würde Dir aber empfehlen es basierend auf der Anleitung auch mal selbst zu probieren:
Delphi-Quellcode:
function ExtractSubStringFromString(StringToExtractFrom : string) : string;
var
  StringStart, StringEnd : Integer;
begin
  StringStart := Pos('Edit1.text', StringToExtractFrom);
  if StringStart > 0 then
    begin
      Delete(StringToExtractFrom, 1, StringStart + 9);
      StringEnd := Pos(' ', StringToExtractFrom);
      if StringEnd > 0 then
        begin
          Delete(StringToExtractFrom, StringEnd, Length(StringToExtractFrom));
          Result := StringToExtractFrom;
        end;
    end;
end;
Wenn Du Fragen zur Funktion hast, nur raus damit.

13Horst37 24. Jun 2009 23:40

Re: Speziellen Substring aus String kopieren
 
Zitat:

Zitat von Popov
Gesucht wird SubString im String. Einziges Indiz: der unbekannte SubString steht immer direkt nach dem bekannten SubString und endet mit einem Leerzeichen.

Ist es das was du willst?

Ja, genau so. :)

Sorry wollte es mit meinen Bezeichnungen blos einfacher machen, weils mich selbst langsam verwirrt...

@ Fridolin

Danke, das werd ich gleich mal ausprobieren. Das einzige was noch nicht stimmt:
Mit Edit1.Text meinte ich eigentlich auch einen String, hab ich leider falsch formuliert. Der ergibt sich eben aus dem Inhalt vom Textfeld Edit1.Text.

Popov 24. Jun 2009 23:44

Re: Speziellen Substring aus String kopieren
 
Ist ungeprüft, sollte aber funktionieren:

Delphi-Quellcode:
var
  p: Integer;
  SubStr, Str, SubStr2: String;
begin
  p := Pos(SubStr, Str);
  Delete(Str, 1, p + Length(SubStr) + 1);
  SubStr2 := Copy (Str, 1, Pos(' ', Str));
  ShowMessage(SubStr2)
Versuch das.

13Horst37 24. Jun 2009 23:53

Re: Speziellen Substring aus String kopieren
 
Hm, würde gerne beide Varianten ausprobieren, aber seit etwa 3 Minuten bekommt mein Delphi regelmäßig den fatalen Fehler "SY576"

Mal schauen ob ich das i-wie noch hinbekomme heute, auf jeden Fall vielen Dank euch beiden, ihr habt mir sehr geholfen!

Kleine Auflösung, wie zur Hölle so ein String überhaupt entstehen kann, falls es jemanden interessiert:
Entschlüsselter Md5 Hash.

Grüße

Fridolin Walther 25. Jun 2009 00:00

Re: Speziellen Substring aus String kopieren
 
Zitat:

Zitat von 13Horst37
Danke, das werd ich gleich mal ausprobieren. Das einzige was noch nicht stimmt:
Mit Edit1.Text meinte ich eigentlich auch einen String, hab ich leider falsch formuliert. Der ergibt sich eben aus dem Inhalt vom Textfeld Edit1.Text.

Achso ... naja, man kann die Funktion problemlos erweitern das der String nach dem anfänglich gesucht wird, ebenfalls übergeben wird. Siehe hier:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function ExtractSubStringFromString(StringToExtractFrom, DeleteFromHere : string) : string;
var
  StringStart, StringEnd : Integer;
begin
  StringStart := Pos(DeleteFromHere, StringToExtractFrom);
  if StringStart > 0 then
    begin
      Delete(StringToExtractFrom, 1, StringStart + Length(DeleteFromHere) - 1);
      StringEnd := Pos(' ', StringToExtractFrom);
      if StringEnd > 0 then
        begin
          Delete(StringToExtractFrom, StringEnd, Length(StringToExtractFrom));
          Result := StringToExtractFrom;
        end;
    end;
end;

const
  TestString = 'c599he9rc8r834n98cr2u4982543957340954309583409 0942358304298543098503495843098dfsaghdsfiouh';
  DeleteFromHere = '2u498';
begin
  writeln(ExtractSubStringFromString(TestString, DeleteFromHere));
  readln;
end.

13Horst37 25. Jun 2009 00:38

Re: Speziellen Substring aus String kopieren
 
Ich nochmal.

Hab Delphi jetz wieder zum laufen gebracht, allerdings will das ganze immernoch nicht funktionieren :(
Vllt überseh ich inzwischen selbst schon i-welche Standartfehler... *Verwirrung*

Delphi-Quellcode:
..blabla code halt
Form1.ExtractSubStringFromString(alpha); // alpha = Der String in dem sich alles abspielt
showmessage(alpha);
Alpha wird von Showmessage unverändert geöffnet.
Was mach ich falsch?!

Fridolin Walther 25. Jun 2009 00:45

Re: Speziellen Substring aus String kopieren
 
Zitat:

Zitat von 13Horst37
Alpha wird von Showmessage unverändert geöffnet.
Was mach ich falsch?!

Du verwechselst Call By Value mit Call By Reference. Der Unterschied? Nun, wenn Du die Funktion so definiert hast, wie in meinem Beispiel, bekommt die Funktion den Wert des Strings übergeben (Call By Value) - nicht aber den String selbst. Das bedeutet, daß die Funktion mit einer Kopie arbeitet und das Original (alpha in Deinem Falle) niemals anrührt. Im Gegensatz dazu steht Call By Reference. Dabei wird eine Referenz auf die Variable übergeben. Alles was Du mit der Variable also in der Funktion anstellst, betrifft die Originalvariable. Es gibt keine Kopie.

Es gibt jetzt 2 Möglichkeiten:
Die Funktion gibt den String zurück. Entspechend könntest Du sagen "alpha := Form1.ExtractSubStringFromString(alpha);".
Oder Du änderst die Funktionsdefinition dahingehend, daß der String nicht by Value übergeben wird, sondern by Reference. Dazu musst Du in der Definition der Funktion ein "var" vor den Parameter Namen setzen. Also z.B. "function ExtractSubStringFromString(var StringToExtractFrom : string) : string;".

Hawkeye219 25. Jun 2009 08:05

Re: Speziellen Substring aus String kopieren
 
Hallo,

noch ein kleiner Hinweis:

Das Funktionsergebnis sollte in jedem Fall initialisiert werden, das sonst unter Umständen ein falsches Ergebnis ausgegeben wird.

Gruß Hawkeye


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