Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.
Seite 1 von 2  1 2      

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