Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi String zwischen 2 bekannten Teilstrings ermitteln (https://www.delphipraxis.net/143743-string-zwischen-2-bekannten-teilstrings-ermitteln.html)

fui-tak 22. Nov 2009 14:03


String zwischen 2 bekannten Teilstrings ermitteln
 
Hallo, diese Funktion liefert einen Teilstring aus einem String zurück. Der Teilstring befindet sich zwischen 2 bekannten Teilstrings, die auch häufiger vorkommen können.

Delphi-Quellcode:
function wertZwischen(inString,zeichen1:string;zeichen1nummer:integer;zeichen2:string;
zeichen2nummer:integer;abErstesZeichen,bisLetztesZeichen:boolean):string;
var pos1,pos2:integer;

   function positionSuchen(hauptstring,suchstring:string;nummerSuchstring:integer):integer;
   var
   i,laenge,pos1,poszaehler: integer;
   begin
     poszaehler := 0;
     for i := 0 to nummerSuchstring-2 do
     begin
       pos1 := Pos(suchstring,hauptstring);
       laenge := Length(suchstring);
       poszaehler := poszaehler+laenge;
       Delete(hauptstring,pos1,laenge);
     end;
     if Pos(suchstring,hauptstring) > 0 then
       Result := Pos(suchstring,hauptstring)+poszaehler
     else Result := 0;
   end;
begin
    if not abErstesZeichen then
       pos1 := positionSuchen(inString,zeichen1,zeichen1nummer) + Length(zeichen1)
    else pos1 := 1;

    if not bisletztesZeichen then
       pos2 := positionSuchen(inString,zeichen2,zeichen2nummer)
    else pos2 := Length(inString)+1;

    Result := Copy(inString,pos1,pos2-pos1);
end;

Zur Verwendung:
Delphi-Quellcode:
var s,teilstring:string;
...

s := '1.2.3.4.5.6.7.8.9';

//nun möchte ich den Wert zwischen '1.2.3.' und '.9' haben, genauer zwischen dem dritten und dem achten Punkt
teilstring := wertZwischen(s,'.',3,'.',8,false,false);
//teilstring ist jetzt '4.5.6.7.8'

//nun möchte ich den Wert vom Anfang bis '3' haben
teilstring := wertZwischen(s,'',0,'3',1,true,false);
//teilstring ist jetzt '1.2.'

//nun möchte ich den Wert zwischen '2.3.' bis zum Ende haben
teilstring := wertZwischen(s,'2.3.',1,'',0,false,true);
//teilstring ist jetzt '4.5.6.7.8.9'
-Der erste Parameter (inString) ist der String, in dem gesucht werden soll

-Der zweite Parameter (zeichen1) ist der String, vor dem gesuchten Wert

-Der dritte Parameter (zeichen1nummer) ist die Nummer des Strings vor dem gesuchten Wert (z.B. wenn man nach dem Wert hinter dem dritten '.' sucht, schreibt man hier 3 hinein)

-Der vierte Parameter (zeichen2) ist der String, hinter dem gesuchten Wert

-Der fünfte Parameter (zeichen2nummer) ist die Nummer des Strings hinter dem gesuchten Wert

-Der sechste Parameter (abErstesZeichen) gibt an, ob der gesuchte Wert beim ersten Zeichen des Strings beginnt. Wenn ja, dann ist er true und der zweite und dritte Parameter sind egal

-Der siebte Parameter (bisLetztesZeichen) gibt an, ob der gesuchte Wert bis zum letzten Zeichen des Strings geht. Entsprechend dem sechsten Parameter

alzaimar 22. Nov 2009 14:11

Re: String zwischen 2 bekannten Teilstrings ermitteln
 
Wofür könnte man das gebrauchen?

himitsu 22. Nov 2009 14:29

Re: String zwischen 2 bekannten Teilstrings ermitteln
 
- ein paar Leerzeichen und Zeilenumbrüche könnten nicht schaden (die Scrollbalken bei mir schreien danach)
- die beiden letzen Parameter (abErstesZeichen,bisLetztesZeichen) finde ich etwas umständlich,
vorallem da man die Indize (zeichen1nummer,zeichen2nummer) dennoch angeben muß, selbst wenn man sie dann nicht benötigt
[edit]
und schon hatte ich diese Parameter falsch verstanden (siehe nächsten Punkt)
drum mal 'ne 2. Version angehängt
[/edit]
- die Parameternamen sind etwas unglücklich
hinter zeichen1nummer und zeichen2nummer würde ich nicht das verstehen, was du meinst
zeichen1 und zeichen2 müssen keine Zeichen sein ... dort passen ja wohl auch ganze Strings rein
- Suchen durch Löschen ist nicht unbedingt optimal ... unnötige und langsame Stringoperationen


Delphi-Quellcode:
Function TextBetween(Const S, StartSearch, StopSearch: String;
    StartIndex: Integer = 1; StopIndex: Integer = -1): String;
  Var i, i2:integer;

  Begin
    Result := '';
    i2 := 1;
    If StopIndex = -1 Then Begin
      Repeat
        i := PosEx(StopSearch, S, i2);
        If i = 0 Then
          If i2 <> 1 Then Break Else Exit;
        i2 := i;
      Until False;
    End Else
      Repeat
        i2 := PosEx(StopSearch, S, i2);
        If i2 = 0 Then Exit;
        Dec(StopIndex);
      Until StopIndex = 0;
    i := 1;
    Repeat
      i := PosEx(StartSearch, S, i);
      If i = 0 Then Exit;
      Dec(StartIndex);
    Until StartIndex = 0;
    Result := Copy(S, i + Length(StartSearch), i2 - i - Length(StartSearch));
  End;
StopIndex nicht angegeben, dann wird der zuletzt gefundene String genommen

und sind hier die lezten Parameter nicht angegeben (oder -1), dann wird der Stringanfang, bzw. das Stringende genommen
Delphi-Quellcode:
Function TextBetween(Const S, StartSearch, StopSearch: String;
    StartIndex: Integer = -1; StopIndex: Integer = -1): String;
  Var i, i2:integer;

  Begin
    Result := '';
    i := 1;
    If StartIndex <> -1 Then Begin
      Repeat
        i := PosEx(StartSearch, S, i);
        If i = 0 Then Exit;
        Dec(StartIndex);
      Until StartIndex = 0;
      Inc(i, Length(StartSearch));
    End;
    i2 := 1;
    If StopIndex <> -1 Then Begin
      Repeat
        i2 := PosEx(StopSearch, S, i2);
        If i2 = 0 Then Exit;
        Dec(StopIndex);
      Until StopIndex = 0;
    End Else i2 := Length(S) + 1;
    Result := Copy(S, i, i2 - i);
  End;
(Codes ungetestet)

fui-tak 22. Nov 2009 18:55

Re: String zwischen 2 bekannten Teilstrings ermitteln
 
Ok, habe gedacht, diese Funktion wäre ganz sinnvoll für den einen oder anderen. Sie hat mir jedenfalls immer gute Dienste geleistet.

Zitat:

Zitat von alzaimar
Wofür könnte man das gebrauchen?

Gebrauchen kann man sowas um verschiedene Daten in einen String zu speichern. Zum Beispiel die Daten einer Person: 'Peter Müller;Musterstrasse;67;11111;Musterhausen'
Das kann zum Beispiel nützlich sein, wenn man mit den Sockets mit SendText arbeitet.

Oder man benutzt eine solche Funktion wenn man von TimeToStr(Time) die Sekunden haben will, oder wenn man aus einer URL den Dateinamen raushaben will, oder wenn man aus irgendwelchen Gründen auch immer einen String in einer solchen Form daliegen hat wie hier


Gut, das ganze bekommt man anders auch hin (teilweise vielleicht auch einfacher), aber ich hab mir das ganze mal geschrieben (nach dem Motto: wer selber denkt wird schlau) und mir gedacht, vielleicht findet es jemand nützlich und interessant


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