![]() |
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:
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.
SubStr1 := Pos (x,s); // x = bekannter Substring, s = "Haupt"
SubStr2 := Copy (s, Substr1+1,7); ShowMessage(SubStr2) 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! |
Re: Speziellen Substring aus String kopieren
Zitat:
|
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. |
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 ;).
|
Re: Speziellen Substring aus String kopieren
Zitat:
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 |
Re: Speziellen Substring aus String kopieren
Zitat:
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? |
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:
Wenn Du Fragen zur Funktion hast, nur raus damit.
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; |
Re: Speziellen Substring aus String kopieren
Zitat:
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. |
Re: Speziellen Substring aus String kopieren
Ist ungeprüft, sollte aber funktionieren:
Delphi-Quellcode:
Versuch das.
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) |
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 |
Re: Speziellen Substring aus String kopieren
Zitat:
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. |
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:
Alpha wird von Showmessage unverändert geöffnet.
..blabla code halt
Form1.ExtractSubStringFromString(alpha); // alpha = Der String in dem sich alles abspielt showmessage(alpha); Was mach ich falsch?! |
Re: Speziellen Substring aus String kopieren
Zitat:
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;". |
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 ![]() Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz