AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi String zwischen 2 bekannten Teilstrings ermitteln

String zwischen 2 bekannten Teilstrings ermitteln

Ein Thema von fui-tak · begonnen am 22. Nov 2009 · letzter Beitrag vom 22. Nov 2009
Antwort Antwort
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#1

String zwischen 2 bekannten Teilstrings ermitteln

  Alt 22. Nov 2009, 15:03
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: String zwischen 2 bekannten Teilstrings ermitteln

  Alt 22. Nov 2009, 15:11
Wofür könnte man das gebrauchen?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#3

Re: String zwischen 2 bekannten Teilstrings ermitteln

  Alt 22. Nov 2009, 15:29
- 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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: String zwischen 2 bekannten Teilstrings ermitteln

  Alt 22. Nov 2009, 19:55
Ok, habe gedacht, diese Funktion wäre ganz sinnvoll für den einen oder anderen. Sie hat mir jedenfalls immer gute Dienste geleistet.

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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 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