![]() |
Re: Stringfilter
@Oreaden: Und um dein Exempel zu statuieren bietest du dem Fragesteller hier übertrieben minimalistischen Code an (der Funktionsname sticht hier schon besonders hervor), wobei er mit recht großer Wahrscheinlichkeit die andere Diskussion garnicht kennt? Da wurde der Disput wohl auf dem falschen Rücken weiter ausgetragen, oder? Das finde ich ist schon eher etwas zum nochmal drüber nachdenken.
Das ist übrigens ein gutes Beispiel für das, was ich in dem ![]() Zudem ist der Kontext hier nicht so weit definiert (mathematische Symbolik vs. "es geht um Strings"), als dass man von allgemein verständlichen Konventionen ausgehen könnte. Oder haben "f", "s" und "a" in der String-Theorie (:stupid:) eine feste Bedeutung? (Wobei ich jedoch gern zugeben möchte, dass die Kürze der Funktion eine einfache Symbolik begünstigt. Der Funktionsname ist hier mein eigentlicher Stein des Anstoßes.) |
Re: Stringfilter
Zitat:
Mir sind die "Set of" Dinger nicht eingefallen :P Himitsu, so wie du das aber programmiert hast, wirds nicht funzn.. Hab ein wenig damit rumgespielt:
Delphi-Quellcode:
type
TSetOfChar = Set of Char; //-- procedure FilterText( var Text: String; const BadChars: TSetOfChar ); var i: Integer; begin for i := Length(Text) downto 1 do if Text[i] in BadChars then Delete(Text, i, 1); end; |
Re: Stringfilter
Zitat:
in welchem bereich bist du tätig? ja, die bezeichnungen sind eindeutig, f() = eine funktion, s = source/string und a ist das array oder parameter... o.k. den parameter hätt ich wohl besser p bezeichnen sollen... wo liegt das problem? es geht doch hier nur um eine funktion... die braucht man doch nicht durchnummerieren... btw: geht doch der ganze thread nur um einen filter... weshalb muss man da dann 1000 das gleiche hinschreiben... ist irgendwie zu mühsamm... schöne grüsse vom orakel Oreaden btw: die informatik hat sich auch von der mathematik abgespalten... somit verstehe ich nicht, was du hier meinst mit stringtheorie und mathematik... |
Re: Stringfilter
So Leute, nachdem wir uns ja im Thread zum Thema 'Horner-Schema' ausreichend mit dem Sinn und Unsinn von Namens- und Formatierungskonventionen augelassen haben, schlage ich vor, das diejenigen, die weiterhin darüber diskutieren wollen, sich entweder in eine Kneipe ihrer Wahl verdünnisieren oder einen separaten Thread aufmachen, um sachlich über dieses an sich sehr wichtige Thema zu diskutieren.
Hier sollte es nur noch um eine Filterfunktion gehen, die entweder unerwünschte Zeichen aus einem String entfernt, oder prüft, ob ein String ungültige Zeichen enthält. Es gibt bezüglich der vorgestellten Funktionen genug Diskussionsstoff (Performance, Eleganz, Allgemeingültigkeit etc.) |
Re: Stringfilter
ich frag mich sowieso wieso ein Set of WideChar nicht geht ... wären doch nur 8 KB, aber da eh nicht alle Unicode nutzen und man ja nicht unbedingt alles auf Unicode umbrechen muß ...
so wäre es dann unicodetauglich und es würden alle Zeichen entfernt, welche in BadChars dinn sind und nicht in ANSI reinpassen, egal welche Codierung ANSI hatt :nerd:
Delphi-Quellcode:
eigentlich müßte Ersteres eher stimmen, aber es scheint mit Letzterem übereinzustimmen ... schon eigenartig :shock:
procedure FilterText(var Text: String; const BadChars: TSysCharSet);
var i: Integer; begin for i := Length(Text) downto 1 do if (Text[i] in BadChars) or not (Text[i] in [#$0000..#$00FF]) then Delete(Text, i, 1); end; // bzw. procedure FilterText(var Text: String; const BadChars: TSysCharSet); var i: Integer; begin for i := Length(Text) downto 1 do if (Text[i] in BadChars) or (Text[i] > #$00FF) then Delete(Text, i, 1); end; [add] so sollte es dann keine Wiedersprüche geben :angel2:
Delphi-Quellcode:
procedure FilterText(var Text: String; BadChars: TSysCharSet);
var i: Integer; begin BadChars := [#$0000..#$00FF] - BadChars; for i := Length(Text) downto 1 do if not (Text[i] in BadChars) then Delete(Text, i, 1); end; |
Re: Stringfilter
@himitsu: mhhh, 'ne ansi funktion... hier mal etwas, was auch chinesische zeichen ordentlich rausfiltert... ;-9
Delphi-Quellcode:
ob's jemand braucht, ist 'ne andere frage :stupid:
procedure f(var s, p: string);
var x: string; c: char; i: integer; begin if (length(s) = 0) or (length(p) = 0) then exit; x := s; s := EmptyStr; setlength(s, length(x)); i := 0; for c in x do if pos(c, p) = 0 then begin inc(i); s[i] := c; end; setlength(s, i); end; btw: TSysCharSet = set of ansichar |
Re: Stringfilter
Dieser Code ersetzt alle verbotenen Zeichen durch ein Ersatzzeichen:
Delphi-Quellcode:
const
VerboteneZeichen = 'äÄöÖüÜß: !'; ErsatzZeichen = '_'; var s: String; c: Char; i: Integer; begin s := 'Müller sagte: Hallo Welt!'; //der Satz ShowMessage('Original: ' + s); for i := 1 to Length(VerboteneZeichen) do begin c := VerboteneZeichen[i]; //immer nur ein Zeichen while Pos(c, s) > 0 do s[Pos(c, s)] := ErsatzZeichen; end; ShowMessage('Verändert: ' + s); end; |
Re: Stringfilter
Hier eine Funktion die ich mal zur Überprüfung von Pfaden geschrieben habe:
Delphi-Quellcode:
Ist schon paar Jahre alt, aber ich denke, daß sie funktionierte.
function IsValidPath(s: String): Boolean;
var i: Integer; t: String; begin Result := False; if Length(s) < 1 then Exit; if s[Length(s)] <> '\' then s := s + '\'; if not (((s[1] in ['a'..'z', 'A'..'Z']) and (Copy(s, 2, 2) = ':\')) or (Copy(s, 1, 2) = '\\')) then Exit; if Copy(s, 1, 2) = '\\' then Delete(s, 1, 2) else Delete(s, 1, 3); while Length(s) > 0 do begin t := Copy(s, 1, Pos('\', s) - 1); if t = '' then Exit; for i := 1 to Length(t) do if Pos(t[i], '\/:*?"<>|') > 0 then Exit; Delete(s, 1, Pos('\', s)); end; Result := True; end; Übrigens, wenn du eine Funktion suchst die überprüft ob Bezeichner aus diesen Buchstaben besteht: 'A'..'Z', 'a'..'z', '0..'9', '_', dann gibt es bereits eine fertige Funktion:
Delphi-Quellcode:
if not IsValidIdent(s) then ...
|
Re: Stringfilter
Hier noch etwas allgemeines, aus meiner Funktionskiste:
Delphi-Quellcode:
Welche Zeichen erlaubt sind steht in ValidChars.
function IsValidStr(s: String): Boolean;
const ValidChars = ['0'..'9', 'A'..'Z', 'a'..'z']; var i: Integer; begin Result := False; if Length(s) < 1 then Exit; for i := 1 to Length(s) do if not (s[i] in ValidChars) then Exit; Result := True; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz