Nein, ich betrachte Flag2 anscheinend anders: True= Suche nur ganze Wörter; False= finde alle Substrings
Wie solln ma das nun machen?
Nein, ich betrachte Flag2 anscheinend anders: True= Suche nur ganze Wörter; False= finde alle Substrings
Wie solln ma das nun machen?
Wir sollten weg von dem Begriff Flag und klar definieren:
$bSens = Sensitivität = TRUE, dann exakte Übereinstimmung
$bPartial = Partialsuche = TRUE, dann Teilsuche
$bReturn = Returntype = TRUE, dann Return Array, sonst String
OK!
Werd das dann im 1 Post editieren und die Testsuite anpassen!
Das mach ich aber erst morgen
lgE
Das hier aus deiner Testsuite erscheint mir auch fehlerhaft:
_Check(16, _StringStrCount("test TEST Test TestTest", "T;E,S", True, False, ";,", True), "3;10;5;5")
Hier werden 2 Zeichen als Trenner übergeben, also ist nur diese gesamte Zeichenfolge der Trenner. Im Teststring ist dieser Trenner nicht enthalten.
Du kannst nicht auch noch für jeden Teilstring einen extra Trenner übergeben.
Der letzte Block weist mehrere Fehler auf:
_Check(13, _StringStrCount("test TEST Test TestTest", "TEST Test", False, False, "", True), "1;3") ; ni.Sens nach "TEST Test"='1;1'
_Check(14, _StringStrCount("test TEST Test TestTest", "TEST Test", False, False, " ", True), "2;5;5") ; ni.Sens nach "TEST" u."Test"='2;3;3'
_Check(15, _StringStrCount("test TEST Test TestTest", "T;EST", False, False, ";", True), "2;10;5") ; ni. Partial "T" u. "EST" ==> 0
_Check(16, _StringStrCount("test TEST Test TestTest", "T;E,S", False, False, ";,", True), "3;10;5;5") ; kein Ergebnis (Trenner= ;,)
_Check(17, _StringStrCount("Testat, testen, Test, Attest. Ostestland", "Test", False, False, "", False), 5) ; ni.Sens nach "Test"=1
Edit
Bei der Rückgabe als String und mehreren Suchbegriffen wird bisher (wenn ich das aus der Testsuite richtig herausgelesen habe) die Summe aller gefundenen Einzelbegriffe zurückgegeben.
Wäre es da nicht evtl. sinnvoller die Einzelsummen getrennt durch den übergebenen Delimiter zurückzugeben? Das würde dann auch der Rückgabe bei Array entsprechen.
Hier mal mein Vorschlag um es nochmal eindeutig zu definieren.
_StringStrCount($sString, $sSearch='', $bSens=False, $bPartial=False, $sDelim='', $bReturn=False)
$sString zu durchsuchender String
$sSearch Suchbegriff(e)
$bSens True = Case Sensitiv / False = nicht Case Sensitiv
$bPartial True = Suchbegriff auch als Teilstring / False = Suchbegriff alleinstehend
$sDelim Trenner bei mehreren Suchbegriffen
$bReturn True = Rückgabe Array / False = Rückgabe String
Bedingungen:
$sSearch = Leerstring UND $sDelim = Leerstring ==> Rückgabe Anzahl ALLER Zeichen
$sSearch = Leerstring UND $sDelim = String ==> Rückgabe Anzahl ALLER Zeichen OHNE $sDelim
$bReturn = True ==> [0]=Anzahl Ergebnisse, [1]..[n]=Anzahl Begriff 1..n
$bReturn = False UND $sSearch = EIN Begriff ==> String Anzahl Begriff
$bReturn = False UND $sSearch = MEHRERE Begriffe ==> String Anzahl Summe ALLER Begriffe
? ODER ==> "(Anzahl_Begriff_1)$sDelim(Anzahl_Begriff_2)$sDelim(Anzahl_Begriff_n)" ?
.
Alles anzeigen
ZitatBei der Rückgabe als String und mehreren Suchbegriffen wird bisher (wenn ich das aus der Testsuite richtig herausgelesen habe) die Summe aller gefundenen Einzelbegriffe zurückgegeben.
Wäre es da nicht evtl. sinnvoller die Einzelsummen getrennt durch den übergebenen Delimiter zurückzugeben? Das würde dann auch der Rückgabe bei Array entsprechen.
Das finde ich nicht so gut.
Ich finde das so besser: Entweder Gesamtsumme ($bReturn = False, als Einzelwert) oder als getrennte Summen ($bReturn = True, dann als Array).
Es wäre jetzt kein Problem mein Script nach Deinen Vorgaben zu ändern, aber ich finde das mit der Gesamtsumme praxistauglicher. Wenn ich die Anzahl der Suchbegriffe ermitteln will, bekomme ich dann gleich einen Wert mit dem ich weiterrechnen kann, ohne ihn erst aufsplitten zu müssen.
Den Rest Deiner Bedingungen erfüllt mein Script.
Hier:
Zitat$bPartial True = Suchbegriff auch als Teilstring / False = Suchbegriff alleinstehend
gibt es aber noch eine Diskrepanz zu den Bedingungen von Eukalyptus. Bei ihm ist das genau umgekehrt definiert. Wobei ich Deine Definition besser finde. $bPartial = True sagt für mich aus, dass auch Teile zugelassen sind.
Edit:
Wäre als Funktionsname nicht "_StringInStrCount" passender (in Anlehnung an "StringInStr")?
Über den Nutzen der Rückgabe als String (getrennt oder summiert) könnte man sicher streiten.
Aber letztlich soll es dann eukalyptus festlegen. Und danach werden wir uns richten.
Sorry!
Bin noch zu nichts gekommen.
Hatte die letzten Tage zuwenig Zeit.
Ich hoffe, Ihr könnt noch etwas warten
lgE
Neue TestSuite in Post #1
Ich sehe keinen Vorteil, wenn bei String-Rückgabe die Ergebnisse getrennt sind. --> Also Gesammtsumme!
Der Suchbegriff muß bei nicht-partial-Suche auch gefunden werden, wenn ihm ein Satzzeichen folgt.
Eine weitere Frage drängt sich auf:
Wenn $sSearch = Leerstring, dann sollen alle Zeichen gezählt werden.
Sollen in diesem Fall auch die @lf,@cr und/oder Leerzeichen mitgezählt werden.
Das wäre dann kein Unterschied zu StringLen!
Was wäre denn praxisorientiert?
lgE
Ein Leerstring als Suchwort ist an sich schon nicht praxisorientiert, IMHO. Mir fällt jedenfalls kein Beispiel ein, wo man sowas gebrauchen könnte.
Ich würde sogar so weit gehen zu sagen, dass dann eine Fehlermeldung zurückgegeben werden sollte.
Und wie Du ja bereits geschrieben hast, gibt es für die Stringlänge bereits einen Befehl.
Damit könnte man dann alle Zeichen zählen (ohne Leerzeichen, @CR und @LF)...
wär das nicht eine wünschenswerte Funktion?!?
lgE
Das kann man auch so:
[autoit]
$sText = "Und Bund rund Undelete und Fundbüro; Und. und! und? und'" & ' und" ' & "Und" & @LF & "Rund" & @CR & "Rund" & @CRLF & "Rund;" & @CRLF & "Aber Aberglaube labern makaber aber"
$tmp = StringRegExpReplace($sText, '\S', '')
MsgBox(0,0,@extended)
Eukalyptus : Oscar
0 : 1
Aber nun alle Zeichen mit Ausnahme des Delimiters?
Das verrate ich hier nicht.
Nachher geben wir alle das gleiche Script ab.
Edit: Mein Script besteht Deinen Test übrigens fehlerfrei.
Edit2: Sollte man nicht noch einen Timer starten?
[autoit]
$iTimer = TimerInit()
_Check(1, _StringInStrCount($sText, "und", False, False, "", False),
; [...]
_Check(17, _StringInStrCount($sText, "", False, True, " ", False), 104)
ConsoleWrite(TimerDiff($iTimer) / 1000 & @CRLF)
Hallo,
ZitatDer Suchbegriff muß bei nicht-partial-Suche auch gefunden werden, wenn ihm ein Satzzeichen folgt.
Diese "Satzzeichen" und auch die erlaubte Position vor/hinter dem Suchstring sollte m.E. definiert werden.
Ich wäre dafür die Satzzeichenklasse [:punct:] und auch alle Ascii-Zeichen kleiner 33 (beinhaltet alle Leer- und Steuerzeichen) sowohl vor dem Suchbegriff als auch hinter dem Suchbegriff stehend als Treffer bei Partial=FALSE zuzulassen.
ciao
Andy
Meine Funktion erfüllt alle Tests
Ich habe aber noch eine Frage was ist mit einem Delimiter mit mehreren Zeichen? Wird dann jedes Zeichen als einzelnes Trennzeichen behandelt oder alles als ein Trennstring?
ZitatIch habe aber noch eine Frage was ist mit einem Delimiter mit mehreren Zeichen? Wird dann jedes Zeichen als einzelnes Trennzeichen behandelt oder alles als ein Trennstring?
Ich behandele den Delimiter als kompletten String:
string="aT_T_Tb" suchstring="" delimiter="T_T" => ergebnis= 2 (a und b) d.h. alle ausser der Delimiterstring
Ich behandele den Delimiter als kompletten String:
string="aT_T_Tb" suchstring="" delimiter="T_T" => ergebnis= 2 (a und b) d.h. alle ausser der Delimiterstring
So hab ich das auch, nur zu Beginn war glaub ich in dem Testpaket ein Test drin wo es getrennt ausgewertet wurde. Der ist zwar rausgeflogen, aber ich frag besser noch mal nach
PS: mein Skript hat bis jetzt von Func bis EndFunc 27 Zeilen.
ZitatPS: mein Skript hat bis jetzt von Func bis EndFunc 27 Zeilen.
Jaja, macht mich nur fertig mit eurem RegEx-Gedöns
Habe 46 Zeilen "zu Fuß" nur mit den Standard-Stringbefehlen. Mal sehen was Geschwindigkeitsmäßig drin ist, wenn die Suche auf eine 1 MB große Datei ausgedehnt wird
ciao
Andy (*doch zu StringRegExp rüberschiel*)
*edit*
habs getestet mit einer 1,7MB grossen html-Datei(zusammenkopiert). Ich finde in 0,7 Sekunden mit
$test=_StringinStrCount($string,"der die das ret <div",false,true," ",false) genau 7600 Fundstellen....
Das Laden der Datei mit fileread() dauert wesentlich länger^^
Finden von allen Zeichen ausser "e" dauert 5 Sekunden und findet 1,6 mio Treffer.
2,5 Ghz AMD
Also mein Script hat bloß 18 Zeilen.
Und Delimeter nicht getrennt, sondern als ganzes.
Ich bleib am Ball, habe mein Script durch RegEx schon ziemlich zusammenstreichen können^^
Wahrscheinlich lacht ihr euch über die Konstruktionen tot, aber ich übe ja noch
Die Geschwindigkeit ist gleich geblieben.