Autor Beitrag
Atreyu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Do 29.11.07 12:40 
Ich habe die String-Funktionen durchsucht, aber nichts gefunden.

Ich will NICHT die Position von Substring in String finden (das verwende ich schon woanders), sondern WIE OFT ein Substring in String vorkommt.

Ich könnte so eine Funktion leicht selbst schreiben, aber 1) Wieso sollte ich, wenn es so eine geben könnte und 2) wäre meine Variante vermutlich systemferner und daher langsamer.

In anderen Sprachen gabs sowas glaub ich mal.

Wenn einer so eine Func kennt, bitte verraten^^
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 29.11.07 12:42 
Soweit ich weiß, gibts die nicht, aber die sollte man wirklich leicht mit Pos und PosEx bauen können :nixweiss:.

_________________
We are, we were and will not be.
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Do 29.11.07 12:49 
Ich hätte jetzt einfach ne Schleife gemacht, die den STring Zeciehn für Zeichen durchgeht und einen Counter erhöht, wenn der Substring erkannt wird. Und das bis zum Ende des Strings.

Mit Pos arbeite ich auch. Ich müsste dann eben die erste Pos von Substring in STring festlegen und ebenfalls irgendwie per MidStr(erste Pos) weitersuchen...
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 29.11.07 12:54 
Genau dafür gibts ja PosEx - da kann man auch angeben, ab welcher Stelle im String gesucht werden soll ;-)

Die Variante, die du vorgeschlagen hast, geht natürlich auch, und dürfte auch ausreichend sein. Wenns wirklich fix gehen soll, und die Texte (und vor allem die gesuchten Teilstrings) etwas länger werden, würde ich eine Variante von Boyer-Moore vorschlagen. Quicksearch ist afaik noch recht einfach zu implementieren.

_________________
We are, we were and will not be.
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Do 29.11.07 12:59 
PosEx liefert mir nur irgendeinen Bytewert oder sowas aus. Damit kenn ich mich nicht ganz aus.

Naja, wie lang kann ein Audiofilename sein? "Artist - Album - Nummer - Song.mp3", also nicht allzu lang. Ich muss nur die ' - ' finden.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 29.11.07 13:06 
Öh...
ausblenden Delphi-Quelltext
1:
2:
function Pos(Substr: string; S: string): Integer;
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;

Der Unterschied ist nur der, dass man bei PosEx den Punkt angeben kann, an dem mit der Suche begonnen werden soll. Dein Problem ließe sich also in etwa so lösen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
offset := PosEx(' - ', Filename, 1);
Count := 0;
While offset <> 0 do
begin
  inc(Count);
  offset := PosEx(' - ', Filename, offset); 
end;

_________________
We are, we were and will not be.
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Do 29.11.07 13:34 
Hmm, sieht sehr einfach aus. Wenn ich das als Funktion mit zB Filename als Parameter und Count als Rückgabewert mache, dann sollte der Zweck erfüllt sein.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 29.11.07 13:43 
Hier gibts eine entsprechende Funktion, die relativ schnell sein dürfte ;-):
www.delphipraxis.net/post409954.html
ausblenden Delphi-Quelltext
1:
Function CountString(Const SubStr, S: WideString): Word;					
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Do 29.11.07 16:40 
Ach du sch.... Okay, Assembler dürfte schnell sein, aber so viel Code will ich gar nicht in mein Source quetschen.
Da nehm ich lieber mal deine Loop.
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Do 29.11.07 16:51 
Scheint auch nicht mehr als ne Schleife zu sein. :mrgreen:

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen