Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

String von rechts kürzen

81 views
Skip to first unread message

Andre Reese

unread,
Feb 18, 2002, 6:23:49 AM2/18/02
to
Hi,

gibt es unter D6 sowas wie pos (Zeichen in String suchen), daß von
rechts loslegt ? Unter VB nennt sich das denn RightInStr anstatt InStr.

Beispiel (Vereichnisname von Dateiname trennen) :

...
TestString := Verzeichnis;
while pos('\', TestString) > 0 do
begin
Posi := pos('\', TestString);
Ergebnis := ConCat(Ergebnis, copy(TestString, 1, Posi));
TestString := copy(TestString, (Posi + 1), (length(TestString) -
Posi));
end;
...

Erscheint mir etwas umständlich. Wäre mit RightPos nen Einzeiler. Gibt
es da eine kürzere Lösung ?

Gruß,

André

Tomas Camo

unread,
Feb 18, 2002, 6:30:14 AM2/18/02
to
> gibt es unter D6 sowas wie pos (Zeichen in String suchen), daß von
> rechts loslegt ? Unter VB nennt sich das denn RightInStr anstatt InStr.
>
> Beispiel (Vereichnisname von Dateiname trennen) :

Es kommt jetzt keine Antwort auf die Stringfunktionen.
Doch wenn du nur den Dateinamen haben willst:
Benutze ExtractFilePath, ExtractFileName und Konsorten.
(Steht alles in der OH mit anderen "Relateds" unter "Siehe auch")

Grüße, Tomas
______________
<werbung>
www.camo-pfeiffer.de
www.germandevnet.de
www.dulzinea.de
</werbung>


Andreas Hörstemeier

unread,
Feb 18, 2002, 6:30:28 AM2/18/02
to
Andre Reese wrote:

> gibt es unter D6 sowas wie pos (Zeichen in String suchen), daß von
> rechts loslegt ? Unter VB nennt sich das denn RightInStr anstatt InStr.

Wie wäre es mit jener Funktion - die sucht das n'te Auftreten eines
Zeichens, und das Vorzeichen von n bestimmt die Suchrichtung.
Mitgeliefert wird eine solche Funktion aber nicht.

function posn(const s,t:string; count:integer):integer;
{ find the count'th occurence of the substring,
if count<0 then look from the back }
var
i,h,last: integer;
u: string;
begin
u:=t;
if count>0 then begin
result:=length(t);
for i:=1 to count do begin
h:=pos(s,u);
if h>0 then
u:=copy(u,pos(s,u)+1,length(u))
else begin
u:='';
inc(result);
end;
end;
result:=result-length(u);
end
if count=0 then result:=last
else result:=0;
end
else
result:=0;
end;

Und tschues,

Andreas

--
Andreas Hoerstemeier
email: an...@scp.de (work)
an...@hoerstemeier.de (home)
www: http://www.hoerstemeier.com

Lutz Tandecki

unread,
Feb 18, 2002, 6:58:19 AM2/18/02
to
Hallo Andreas,

bist Du sicher, daß das funktioniert? Wenn count <= 0,
liefert die Funktion doch 0 zurück, oder? Und "last" wird
irgendwie auch nicht gesetzt...

Bye, Lutz.


Simon Reinhardt

unread,
Feb 18, 2002, 7:10:31 AM2/18/02
to
Andre Reese <andre...@web.de> schrieb in news:3C70E445...@web.de:

> gibt es unter D6 sowas wie pos (Zeichen in String suchen), daß von
> rechts loslegt ? Unter VB nennt sich das denn RightInStr anstatt InStr.

LastDelimiter(), Unit SysUtils

Du suchst aber eigentlich ExtractFileDir()/ExtractFilePath().


Simon
--
Your mouse has moved. Windows has to reboot for changes to take effect.

Homepage: http://www.picsoft.de
Delphi Fundgrube: http://www.picsoft.de/faq.htm

Andreas Hörstemeier

unread,
Feb 18, 2002, 8:19:27 AM2/18/02
to
Lutz Tandecki wrote:

> bist Du sicher, daß das funktioniert? Wenn count <= 0,
> liefert die Funktion doch 0 zurück, oder? Und "last" wird
> irgendwie auch nicht gesetzt...

Mist,da sind ein paar Zeilen zwischendrin verlorengegangen. Also nochmal
komplett:

function posn(const s,t:string; count:integer):integer;

{ find the count'th occurence of the substring,
if count<0 then look from the back }

var
i,h,last: integer;
u: string;
begin
u:=t;
if count>0 then begin
result:=length(t);
for i:=1 to count do begin
h:=pos(s,u);
if h>0 then
u:=copy(u,pos(s,u)+1,length(u))
else begin
u:='';
inc(result);
end;
end;
result:=result-length(u);
end

else if count<0 then begin
last:=0;
for i:=length(t) downto 1 do begin
u:=copy(t,i,length(t));
h:=pos(s,u);
if (h<>0) and (h+i<>last) then begin
last:=h+i-1;
inc(count);
if count=0 then BREAK;
end;


end;
if count=0 then result:=last
else result:=0;
end
else
result:=0;
end;

--

Joachim Mohr

unread,
Feb 18, 2002, 10:04:21 AM2/18/02
to

Andreas Hörstemeier wrote:

> Lutz Tandecki wrote:

> function posn(const s,t:string; count:integer):integer;


Und: Für Liebhaber von Rekursionen:
function pos_n(const a: string; b: string; n: integer): integer;
var k: integer;
begin
if n < 1 then Begin result := 0; exit End; //Sollte nicht vorkommen
if n = 1 then result := pos(a, b) else Begin
k := pos(a, b);
if k = 0 then result := 0 else BEgin
b := copyab(b, k + 1);
result := pos_n(a, b, n - 1); //rekursiv
if result > 0 then result := k + result;
ENd;
End;
end;

function wort_n(const s: string; const n: integer): string;
var p: integer; //z.B. 'aaa bbb ccc'; mindestens ein ' ' dazwischen
begin
p := pos(' ', s);
if p = 0 then Begin
if n > 1 then result := '' else result := trim(s);
End else Begin //p>0
if n = 1 then result := trim(copy(s, 1, p - 1)) else
result := wort_n(trim(copyab(s, p + 1)), n - 1);
End;
end;

MFG Joachim Mohr
http://delphi.zsg-rottenburg.de
brandneu: TTMathe

0 new messages